@ynblpb_spb
дятел php

Mysql не использует индекс, почему?

Есть таблица
CREATE TABLE `table` (
			  `query_id` int(10) NOT NULL,
			  `word_id` int(10) NOT NULL,
			  KEY `mykey` (`query_id`, `word_id`)
			) ENGINE=MEMORY


есть запрос
SELECT sqw.query_id FROM `table` AS sqw 
WHERE sqw.word_id IN (78074, 245535, 74712, 75380, 77047, 87306) 
AND sqw.query_id != 52297983 
GROUP BY sqw.query_id 
HAVING COUNT(*) >= 4


когда делаешь explain, то выдает, что possible_keys = mykey, а используемый ключ - NULL.

Дальше начинаются тесты =)
  1. Удаляем индекс и создаем индекс только по полю query_id -- используемый ключ в explan - NULL.
  2. Удаляем индекс и создаем индекс только по полю word_id -- используемый ключ в explan - word_id, но на время выполнения запроса никак не влияет
  3. Удаляем из запроса GROUP и HAVING, результат использования индексов не меняется никак.
  4. Порядок полей в WHERE не меняет ситуацию.


У кого какие мысли? Куда копнуть, что почитать?

======
UPD:

созданы индексы:
ALTER TABLE `table` ADD INDEX `qw` ( `query_id`, `word_id`);
ALTER TABLE `table` ADD INDEX `wq`( `word_id`, `query_id`);
ALTER TABLE `table` ADD INDEX `w`( `word_id`);
ALTER TABLE `table` ADD INDEX `q`( `query_id`);


Запрос
EXPLAIN SELECT sqw.query_id FROM `table` AS sqw 
WHERE sqw.word_id IN (78074, 245535, 74712, 75380, 77047, 87306) 
AND sqw.query_id != 52297983 
GROUP BY sqw.query_id 
HAVING COUNT(*) >= 4

выдает такой результат:
key = w
possible_keys = q, w, qw, wq

EXPLAIN SELECT sqw.query_id FROM `table` AS sqw 
WHERE sqw.word_id IN (78074, 245535, 74712, 75380, 77047, 87306) 
AND sqw.query_id != 52297983

выдает такой результат:
key = w
possible_keys = q, w, qw, wq

EXPLAIN SELECT sqw.query_id FROM `table` AS sqw 
WHERE sqw.query_id != 52297983 
AND sqw.word_id IN (78074, 245535, 74712, 75380, 77047, 87306)

выдает такой результат:
key = w
possible_keys = q, w, qw, wq
  • Вопрос задан
  • 2820 просмотров
Пригласить эксперта
Ответы на вопрос 2
rpsv
@rpsv
делай либо хорошо, либо никак
Попробуйте в запросе поменять местами поля:
SELECT sqw.query_id FROM `table` AS sqw 
WHERE sqw.query_id != 52297983 AND sqw.word_id IN (78074, 245535, 74712, 75380, 77047, 87306) 
GROUP BY sqw.query_id 
HAVING COUNT(*) >= 4
Ответ написан
isset89
@isset89
Врёшь, тебе нравится
по полю query_id не используется, т.к индексы не работают на условия !=
Индекс применяется для столбцов, которые сравниваются с помощью следующих операторов: =, >, >=, <, <=, BETWEEN и LIKE с префиксом, не содержащим шаблонного символа, такого как something%.

SELECT sqw.query_id FROM `table` AS sqw 
WHERE sqw.query_id IN (52297983) AND sqw.word_id IN (78074, 245535, 74712, 75380, 77047, 87306) 
GROUP BY sqw.query_id 
HAVING COUNT(*) >= 4


ALTER TABLE `table` ADD INDEX `qw` ( `query_id`, `word_id`);
ALTER TABLE `table` ADD INDEX `w`( `word_id`);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы