SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.03.2012 16:29:48

kostasoft
Участник
Зарегистрирован: 23.08.2011
Сообщений: 9

Индексирование дат в существующей таблице

Имеется ключевое поле `ids` (BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) и поле с датой `startdate` (DATETIME).
Делаю выборку "SELECT COUNT(`ids`) FROM `stat_table` WHERE (startdate BETWEEN '"+MakeMySQLDate(viewdate1)+" 00:00:00' AND '"+MakeMySQLDate(viewdate2)+" 23:59:59')"
База уже достаточно большая, и операция происходит около 20-30 секунд.
Появилась идея проиндексировать таблицу по полю startdate. В связи с этим возникает несколько вопросов:
1. Как проиндексировать существующую таблицу?
2. Ее придется индексировать при вводе каждой новой записи?
3. В моем случае мне делать выборку так: SELECT COUNT(`ids`) или лучше так: SELECT COUNT(`startdate`) ?

Неактивен

 

#2 04.03.2012 17:17:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Индексирование дат в существующей таблице

Замените BETWEEN на >= вкупе с <=, between не использует индекс.
Добавьте индекс на поле startdate - create index startdate_index on stat_table(start_date);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 05.03.2012 02:09:42

kostasoft
Участник
Зарегистрирован: 23.08.2011
Сообщений: 9

Re: Индексирование дат в существующей таблице

Отлично, спасибо, все полетело!
А мне нужно будет периодически как-нибудь обновлять этот индекс, или при добавлении новых данных в таблицу индекс сам пересчитывается?

Неактивен

 

#4 05.03.2012 02:33:31

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Индексирование дат в существующей таблице

Сам пересчитывается. Но иногда имеет смысл подействовать на таблицу оператором analyze table, чтобы cardinality пересчиталось (см. http://sqlinfo.ru/forum/viewtopic.php?id=4477)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 05.03.2012 03:15:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Индексирование дат в существующей таблице

Согласно документации, индекс должен использоваться и для BETWEEN http://dev.mysql.com/doc/refman/5.1/en/ … dexes.html
"A B-tree index can be used for column comparisons in expressions that use the =, >, >=, <, <=, or BETWEEN operators."

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson