Доброго время суток.
У меня такая проблема. Есть 2 абсолютно идентичные таблицы по структуре. В одной хранятся данные рабочего проекта ( записей около 1,8 миллиона ), а другая для тестирования, где я вношу разные изменения для тестов. Дак вот. Я создал индекс в тестовой таблице (где мало записей) и он удачно отработал по запросу. Потом я точно такой же создал уже в основной таблице( где 1,8 миллиоан записей) и там он с успехом провалился, и в эксплэйне мне выдало файлсорт. Версия базы данных mysql-server-5.1.22. Из-за чего произошла такая ситуация? Ниже приведины дампы таблиц и запросы.
| FacebookBirthday | CREATE TABLE `FacebookBirthday` (
`fbID` bigint(20) unsigned NOT NULL,
`year` smallint(5) unsigned NOT NULL,
`month` tinyint(3) unsigned NOT NULL,
`day` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`fbID`),
KEY `ix_bd` (`day`,`month`,`year`),
KEY `ix_month_day` (`month`,`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
| FacebookBirthdayTest | CREATE TABLE `FacebookBirthdayTest` (
`fbID` bigint(20) unsigned NOT NULL,
`year` smallint(5) unsigned NOT NULL,
`month` tinyint(3) unsigned NOT NULL,
`day` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`fbID`),
KEY `ix_bd` (`day`,`month`,`year`),
KEY `ix_month_day` (`month`,`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Explain
explain SELECT * FROM FacebookBirthday WHERE fbID IN (100002903938789,100002912073949,100003102251184,100003490075487,1072137856,1134930022,1568329778,1753344728,100000497671423,100000736316579,100001024075426,100001390005020,100001463863250,100001648249993) AND UNIX_timestamp(CONCAT_WS('-',2012, month, day)) - UNIX_timestamp('2012-07-27') < 0 ORDER BY month, day;
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-----------------------------+
| 1 | SIMPLE | FacebookBirthday | range | PRIMARY | PRIMARY | 8 | NULL | 14 | Using where; Using filesort |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-----------------------------+
explain SELECT * FROM FacebookBirthdayTest WHERE fbID IN (100002903938789,100002912073949,100003102251184,100003490075487,1072137856,1134930022,1568329778,1753344728,100000497671423,100000736316579,100001024075426,100001390005020,100001463863250,100001648249993) AND UNIX_timestamp(CONCAT_WS('-',2012, month, day)) - UNIX_timestamp('2012-07-27') < 0 ORDER BY month, day;
+----+-------------+----------------------+-------+---------------+--------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+-------+---------------+--------------+---------+------+------+-------------+
| 1 | SIMPLE | FacebookBirthdayTest | index | PRIMARY | ix_month_day | 2 | NULL | 4 | Using where |
+----+-------------+----------------------+-------+---------------+--------------+---------+------+------+-------------+