Можно ли производить поиск по таблице, задавая диапозон id?
Сделал небольшое открытие для себя и хотелось бы узнать, можно ли так делать?
Дано: Таблица с товарами, где есть ID позиции в каталоге, статус товара и скрыт/показан ли товар. Мой старый запрос, который считал кол-во строк в таблице выглядел так:
SELECT count(*) from goods where catalog_id=0 and hidden=0 and status=0;
(нужные индексы есть)
Среднее время исполнения этого запроса 0.3-0.5 секунд (в таблице почти пол миллиона строк). Новый запрос выглядит так:
SELECT
count(*)
FROM
goods
WHERE
catalog_id=0 and hidden=0 and status=0 and
id >= (SELECT min(id) FROM goods WHERE catalog_id=0) and
id <= (SELECT max(id) FROM goods WHERE catalog_id=0);
Среднее время исполнения - 0.05-0.08 секунд. Честно говоря я был удивлён. По идее MySQL требуется выполнять больше сравнений, разве не так? И вообще есть ли какие-то возможные проблемы, которые могут появится при использовании такого метода?
Кстати, во втором случае команда explain выводит в колонке extra следующее:
Select tables optimized away
А, кол-во в колонке rows вместо 800 (как в первом случае) - 68. Хотя обе команды возвращают одно и то же число.
UPD. Структура - https://pastebin.com/q2F4vVd8
Ответы (1 шт):
Индексы по столбцам catalog_id, hidden и stаtus имеют крайне низкую селективность. Большинство СУБД исключают такие индексы из обработки.
А вот выборка по диапазону уникального ключа как раз очень эффективна. Во всяком случае пока в диапазон попадает меньше половины таблицы.