Можно ли производить поиск по таблице, задавая диапозон 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 имеют крайне низкую селективность. Большинство СУБД исключают такие индексы из обработки.

А вот выборка по диапазону уникального ключа как раз очень эффективна. Во всяком случае пока в диапазон попадает меньше половины таблицы.

→ Ссылка