MYSQL с использованием сортировки файлов, когда индексированный столбец ORDER BY в простом запросе - PullRequest
4 голосов
/ 01 сентября 2011

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

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

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;

Я подумал, добавив индекс на значение2, он остановит запрос на использование сортировки файлов.Однако, 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)

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

Спасибо!

1 Ответ

6 голосов
/ 01 сентября 2011

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

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

...