Удовлетворение MySQL с помощью индекса - PullRequest
3 голосов
/ 17 ноября 2011

Пожалуйста, рассмотрите следующую схему

CREATE table articles (
    id Int UNSIGNED NOT NULL AUTO_INCREMENT,
    cat_id Int UNSIGNED NOT NULL,
    status Int UNSIGNED  NOT NULL,
    date_added Datetime,
    Primary Key (id)) ENGINE = InnoDB;

CREATE INDEX cat_list_INX ON articles (cat_id, status, date_added);
CREATE INDEX categories_list_INX ON articles (cat_id, status);

Я написал следующие два запроса, которые могут быть полностью удовлетворены двумя вышеупомянутыми признаками, но MySQL помещает где в дополнительный столбец.

mysql> EXPLAIN SELECT cat_id FROM articles USE INDEX (cat_list_INX) WHERE cat_id=158 AND status=2 ORDER BY date_added DESC LIMIT 500, 5;
+----+-------------+----------+------+---------------+--------------+---------+-------------+-------+--------------------------+
| id | select_type | table  ref         |   | type | possible_keys | key          | key_len | rows  | Extra                    |
+----+-------------+----------+------+---------------+--------------+---------+-------------+-------+--------------------------+
|  1 | SIMPLE      | articles | ref  | cat_list_INX  | cat_list_INX | 5       | const,const | 50698 | Using where; Using index |
+----+-------------+----------+------+---------------+--------------+---------+-------------+-------+--------------------------+


mysql> EXPLAIN SELECT cat_id FROM articles USE INDEX (categories_list_INX) WHERE cat_id=158 AND status=2;
+----+-------------+----------+------+---------------------+---------------------+---------+-------------+-------+--------------------------+
| id | select_type | tab key                 |le    | type | possible_keys       | key_len | ref         | rows  | Extra                    |
+----+-------------+----------+------+---------------------+---------------------+---------+-------------+-------+--------------------------+
|  1 | SIMPLE      | articles | ref  | categories_list_INX | categories_list_INX | 5       | const,const | 52710 | Using where; Using index |
+----+-------------+----------+------+---------------------+---------------------+---------+-------------+-------+--------------------------+

Насколько я знаю, где требуется дополнительный поиск диска.Почему это не просто использование индекса?

1 Ответ

4 голосов
/ 17 ноября 2011

Первый запрос - фильтрация записей на уровне mysql вне механизма хранения из-за вашего предложения «ORDER BY» с использованием поля date_added.

Это можно уменьшить, переместив поле date_added первым в индексе, как это

CREATE INDEX cat_list_INX ON articles (date_added, cat_id, status);

Во втором запросе - моя версия mysql не показывает «Использование где» - я бы тоже не ожидал - возможно, потому что у меня нет записей.

mysql> EXPLAIN SELECT cat_id FROM articles USE INDEX (categories_list_INX) WHERE cat_id=158 AND status=2;
+----+-------------+----------+------+---------------------+---------------------+---------+-------------+------+-------------+
| id | select_type | table    | type | possible_keys       | key                 | key_len | ref         | rows | Extra       |
+----+-------------+----------+------+---------------------+---------------------+---------+-------------+------+-------------+
|  1 | SIMPLE      | articles | ref  | categories_list_INX | categories_list_INX | 8       | const,const |    1 | Using index |
+----+-------------+----------+------+---------------------+---------------------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

Дополнительная информация о столбце из High Performance MySQL:

Использование индекса: Это означает, что MySQL будет использовать индекс покрытия, чтобы избежать доступа к таблице. Не путайте закрывающие индексы с типом доступа индекса.

Использование Where: Это означает, что сервер MySQL постфильтрует строки после того, как механизм хранения их получит. Многие условия WHERE, которые включают столбцы в индексе, могут быть проверены механизмом хранения, когда (и если) он читает индекс, поэтому не все запросы с предложением WHERE будут показывать «Использование где». Иногда наличие «Использование где» является подсказкой, что запрос может извлечь выгоду из другой индексации.

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