Использование индекса с запросом типа диапазона и другими критериями - PullRequest
2 голосов
/ 18 октября 2011

Мне нужна помощь с этим. У меня есть такой запрос:

SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199);

Приведенный выше запрос использует индекс btree для ts_in colomn (тип диапазона). Теперь я хочу добавить еще один критерий к этому. Например:

SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) and is_removed=0;

Приведенный выше запрос не использует индекс btree для ts_in colomn (диапазон).

Может кто-нибудь сказать мне, почему и как я могу сделать это правильно, чтобы достичь очень быстрых вычислений.

Я создал два индекса для тестирования:

CREATE INDEX range_idx_1 using BTREE
ON cart (is_removed, ts_in);

и

CREATE INDEX range_idx_2 using BTREE
ON cart (ts_in , is_removed);

Что смешного в том, что когда я использую этот запрос:

EXPLAIN SELECT id FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) AND is_removed=0;

Я получаю эти результаты:

id | select_type | table | type  | possible_keys           | key         | key_len | ref | rows  | Extra 
1  | SIMPLE      | cart  | range | range_idx_1,range_idx_2 | range_idx_1 | 6       |     | 17391 | Using where; Using index

Приведенный выше запрос использует индекс, но:

EXPLAIN SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) AND is_removed=0;

У меня есть такие результаты:

id | select_type | table | type  | possible_keys           | key         | key_len | ref   | rows  | Extra 
1  | SIMPLE      | cart  | ref   | range_idx_1,range_idx_2 | range_idx_1 | 1       | const | 77979 | Using where

Индекс не используется.

Когда я пытаюсь использовать синтаксис INDEX или FORCE INDEX, результаты совпадают. В одном случае Mysql не использует индекс. Любая помощь?

1 Ответ

1 голос
/ 18 октября 2011

пробег

EXPLAIN SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) and is_removed=0;

чтобы понять, почему оптимизатор запросов mysql выбирает другой индекс.

Mysql не очень хорошо комбинирует индексы, поэтому вам, вероятно, понадобится комбинированный индекс для этого запроса. Попробуйте добавить индекс (btree?) Для is_removed, ts_in (в этом порядке!).

Вы можете также заставить mysql использовать ваш индекс, добавив USE INDEX к вашему запросу. Иногда это дает лучший результат, поскольку индекс, выбранный оптимизатором запросов:

SELECT * FROM cart USE INDEX '<idx_name>' WHERE
(ts_in between 1249077600 AND 1318975199) and is_removed=0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...