Задавайте вопросы, мы ответим
Вы не зашли.
Имеется ключевое поле `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`) ?
Неактивен
Замените BETWEEN на >= вкупе с <=, between не использует индекс.
Добавьте индекс на поле startdate - create index startdate_index on stat_table(start_date);
Неактивен
Отлично, спасибо, все полетело!
А мне нужно будет периодически как-нибудь обновлять этот индекс, или при добавлении новых данных в таблицу индекс сам пересчитывается?
Неактивен
Сам пересчитывается. Но иногда имеет смысл подействовать на таблицу оператором analyze table, чтобы cardinality пересчиталось (см. http://sqlinfo.ru/forum/viewtopic.php?id=4477)
Неактивен
Согласно документации, индекс должен использоваться и для 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."
Неактивен