Оператор SELECT не использует возможные_ключи - PullRequest
10 голосов
/ 31 марта 2011

У меня есть таблица из устаревшей системы, в которой нет первичного ключа. Он записывает транзакционные данные для выпуска материалов на фабрике.

Для простоты предположим, что каждая строка содержит номер задания, номер детали, количество и дату.

Я добавил индекс в столбец даты выпуска. Когда я запускаю EXPLAIN SELECT * FROM выпустила_частей ГДЕ date_issued> '20100101', он показывает это:

+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+
| id | select_type | table          | type | possible_keys     | key  | key_len | ref  | rows    | Extra       |
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | issued_parts   | ALL  | date_issued_alloc | NULL | NULL    | NULL | 9724620 | Using where |
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+

Значит, он видит ключ, но не использует его? Может кто-нибудь объяснить, почему?

Ответы [ 3 ]

10 голосов
/ 31 марта 2011

Что-то подсказывает мне, что MySQL Query Optimizer определился правильно.

Вот как вы можете это определить.Запустите эти команды:

Количество строк

SELECT COUNT(1) FROM issued_parts;

Количество строк, соответствующих вашему запросу

SELECT COUNT(1) FROM issued_parts WHERE date_issued > '20100101';

Если число строк, которые вы фактически получаете, превышает 5% отОбщее количество таблиц, MySQL Query Optimizer решает, что будет меньше усилий, чтобы выполнить полное сканирование таблицы.

Теперь, если ваш запрос был более точным, например, с этим:

SELECT * FROM issued_parts WHERE date_issued = '20100101';

тогда вы получите совершенно другой план EXPLAIN.

0 голосов
/ 31 марта 2011

Существует несколько типов индексов (индексов?). Хеш-индекс - это быстрый способ поиска элемента с заданным значением. Если у вас есть несколько дискретных значений, к которым вы обращаетесь (например, список из 10 дат), то вы можете вычислить хеш для каждого из этих значений и найти их в индексе. Поскольку вы не выполняете поиск по конкретному значению, а скорее проводите сравнение, хеш-индекс вам не поможет.

С другой стороны, индекс B-Tree может помочь вам, поскольку он упорядочивает элементы, которые он индексирует. Например, см. Здесь: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html для mysql (поиск характеристик индекса B-дерева). Возможно, вы захотите убедиться, что ваша таблица использует индекс b-дерева для своего столбца индекса.

0 голосов
/ 31 марта 2011

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

...