Оптимизировать запрос DISTINCT / LIMIT MySQL для разбивки на страницы - PullRequest
3 голосов
/ 15 февраля 2011

У меня есть следующий SQL:

SELECT group_id FROM products WHERE category = 12345 GROUP BY group_id LIMIT 0, 10

или:

SELECT DISTINCT group_id FROM products WHERE category = 12345 LIMIT 0, 10

LIMIT используется для нумерации страниц.Я хочу знать, как я могу избежать MySQL для поиска всех строк, пока он не найдет 10 различных group_ids, которые я хочу.Например, если я сделал:

SELECT DISTINCT group_id FROM products WHERE category = 12345 LIMIT 200, 10

Он будет сканировать первые 200 строк с категорией = 12345, а затем начнет собирать 10 различных идентификаторов group_ids?

ОБНОВЛЕНИЕ: Чтоесли я создал индекс для (group_id, category)?

1 Ответ

1 голос
/ 15 февраля 2011

Ваш запрос найдет первые 200 отдельных строк, а затем выведет следующие 10. DISTINCT выполняется до LIMIT. В зависимости от индексации и того, как таблица хранится, она может прекратить сбор уникальных значений, как только выполнит условие limit. Это наиболее вероятно, если значение, которое вы хотите различить, проиндексировано.

(Кстати, вы улучшите читабельность запроса, если будете использовать LIMIT 10 OFFSET 200 вместо старой неинтуитивной записи LIMIT 200, 10.)

...