MySQL между двумя датами индекса - PullRequest
0 голосов
/ 28 сентября 2011

Я выбираю данные из таблицы базы данных mysql.Когда я ищу конкретную дату, мой индекс работает хорошо.Когда я ищу данные между двумя датами, индекс не работает, а запрос занимает много времени.Кто-нибудь знает, как я могу улучшить запрос или индекс?

Запрос A:

EXPLAIN SELECT * FROM sal_import  
WHERE dateStats>="2011-07-28" AND dateStats<="2011-07-30" GROUP BY f_shop


id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  i   range   dateStats   dateStats   3   (NULL)  7896    Using where; Using temporary; Using filesort

Запрос B:

EXPLAIN SELECT * FROM sal_import i 
WHERE dateStats="2011-07-30" GROUP BY f_shop


id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  i   ref dateStats   dateStats   3   const   2182    Using where

Это индексТаблица:

ALTER TABLE sal_import ADD INDEX(dateStats,f_shop);

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Попробуйте это:

SELECT * FROM sal_import WHERE dateStats BETWEEN '2011-07-28' AND '2011-07-30'

Также см. http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

0 голосов
/ 28 сентября 2011

Причина в том, что индекс даты не является кластеризованным, и поэтому данные не упорядочены последовательно этим ключом на диске.В вашей таблице небольшое количество записей, поэтому оптимизатор запросов решил, что быстрее выполнить полное сканирование таблицы, а не использовать вторичный индекс и объединить записи.

В таблице может быть только одна кластеризованная таблица.индекс и это обычно первичный ключ.Столбец даты, как правило, является допустимым и разумным столбцом для размещения кластеризованного индекса, но он может быть не лучшим его использованием;это действительно зависит от того, как используется эта таблица.

http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

К сожалению, в MySQL кластерный индекс должен находиться в уникальном столбце, и вы не можете определить кластерный индекс по столбцу (очевидно);база данных выбирает этот индекс для вас по умолчанию.Учитывая это, вам может не повезти в этом.

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...