MYSQL использует сортировку файлов, когда индексированный столбец ORDER BY в простом запросе

Я видел много подобных вопросов, но я не вижу решения, которое будет работать для меня. Или, может быть, я просто туплю. :) Надеюсь, кто-то может мне помочь.

У меня есть следующая таблица:

CREATE TABLE `table_name` (
  `value1` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `value2` varchar(50) NOT NULL,
  `value3` tinytext,
  `value4` tinytext,
  `value5` tinytext,
  `value6` char(3) DEFAULT NULL,
  `value7` char(3) DEFAULT NULL,
  PRIMARY KEY (`value1`),
  KEY value2_index ('value2')
) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=latin1;

Чтобы убедиться, что мои индексы были установлены, это результат SHOW INDEX:

+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table        | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| table_name   |          0 | PRIMARY        |            1 | value1      | A         |          43 |     NULL | NULL   |      | BTREE      |         |
| table_name   |          1 | value2_index   |            1 | value2      | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
2 rows in set (0.00 sec)

Где я запускаю этот запрос:

SELECT value2, value6
FROM table_name
WHERE value7 = 'Yes'
ORDER BY value2;

Я думал, что добавление индекса для value2 предотвратит использование запросом файловой сортировки. Однако EXPLAIN показывает иначе:

+----+-------------+--------------+------+---------------+------+---------+------+------+-----------------------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows | Extra                       |
+----+-------------+--------------+------+---------------+------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | table_name   | ALL  | NULL          | NULL | NULL    | NULL |   43 | Using where; Using filesort |
+----+-------------+--------------+------+---------------+------+---------+------+------+-----------------------------+
1 row in set (0.00 sec)

Что я делаю не так?

Спасибо!


person Yazmin    schedule 01.09.2011    source источник


Ответы (1)


Запрос сначала должен найти строки со значением7 = «Да», что означает, что ваш индекс должен включать значение7 в качестве первого столбца, который будет использоваться. Для тех строк, которые совпадают, он должен упорядочиваться по значению2. Так что этому запросу нужен многостолбцовый индекс (value7, value2).

Подробнее об индексах можно прочитать в документах по MySQL.

person nathan    schedule 01.09.2011