Обеспечение запроса в MySql для использования определенного индекса - PullRequest
0 голосов
/ 14 мая 2010

У меня большой стол. состоит только из 3 столбцов (id (INT), bookmarkID (INT), tagID (INT)). У меня есть два индекса BTREE, по одному для каждого столбца bookmarkID и tagID. Эта таблица содержит около 21 миллиона записей. Я пытаюсь выполнить этот запрос:

SELECT bookmarkID,COUNT(bookmarkID) AS count
FROM bookmark_tag_map
GROUP BY tagID,bookmarkID
HAVING tagID IN (-----"tagIDList"-----) AND count >= N

, который возвращает целую вечность, чтобы вернуть результаты. Я где-то читал, что если создать индекс, в котором он имеет tagID, bookmarkID вместе, я получу намного более быстрый результат. Я создал индекс через некоторое время. Попробовал запрос еще раз, но кажется, что этот запрос не использует новый индекс, который я создал. Я запустил EXPLAIN и увидел, что это действительно так. Мой вопрос сейчас заключается в том, как я могу заставить запрос использовать определенный индекс? также приветствуются комментарии о других способах сделать запрос быстрее. Спасибо

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

Прежде всего, странно иметь tagID в предложении group by, но не в выбранных полях, потому что вы не будете знать, к какому тегу относится счетчик. Вы уверены, что хотите, чтобы tagID в группе? Если вам просто нужны самые частые закладки для определенных наборов тегов, тогда вам это не нужно. Мое предложение сделать это быстрее - переместить условие tagID в предложение where:

SELECT bookmarkID,COUNT(bookmarkID) AS count
FROM bookmark_tag_map
WHERE tagID IN (-----"tagIDList"-----)
GROUP BY bookmarkID
HAVING count >= N

Это должно быть намного быстрее, но для 12 миллионов записей, вероятно, все еще недостаточно быстро, чтобы использовать его на часто вызываемой странице без кэширования.

2 голосов
/ 14 мая 2010

Взгляните на синтаксис Index Hint

...