Есть таблица
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.
Дальше начинаются тесты =)
- Удаляем индекс и создаем индекс только по полю query_id -- используемый ключ в explan - NULL.
- Удаляем индекс и создаем индекс только по полю word_id -- используемый ключ в explan - word_id, но на время выполнения запроса никак не влияет
- Удаляем из запроса GROUP и HAVING, результат использования индексов не меняется никак.
- Порядок полей в 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