SQL: оптимизировать запрос к большой таблице с помощью индексации - PullRequest
0 голосов
/ 01 октября 2019

Например, у меня есть следующая таблица:

table Product
------------
id
category_id 
processed
product_name

Эта таблица имеет индекс по столбцам id category_id и processed и (category_id, proccessed). Статистические данные в этой таблице:

select count(*) from Product; -- 50M records
select count(*) from Product where category_id=10; -- 1M records
select count(*) from Product where processed=1; -- 30M records

Мой самый простой запрос, который я хочу запросить: (выберите * является обязательным).

select * from Product 
where category_id=10 and processed=1 
order by id ASC LIMIT 100  

Вышеуказанный запрос без ограничения имеет только около10000 записей.

Я хочу вызвать вышеуказанный запрос несколько раз. Каждый раз, когда я выхожу, я обновляю поле processed до 0. (поэтому оно не появится в следующем запросе). Когда я тестирую реальные данные, иногда оптимизатор пытается использовать id в качестве ключа, так что это стоит много времени.

Как я могу оптимизировать приведенный выше запрос (в общем случае)

P / S: во избежание путаницы я знаю, что лучшим индексом должен быть (категория, обработано, id). Но я не могу изменить индекс. Мой вопрос касается только оптимизации запроса.

Спасибо

Ответы [ 2 ]

4 голосов
/ 01 октября 2019

Для этого запроса:

select *
from Product
where category_id = 10 and processed = 1
order by id asc
limit 100;

Оптимальный индекс для product(category_id, processed, id). Это один индекс с ключом из трех частей, ключи которого расположены в следующем порядке.

0 голосов
/ 12 октября 2019

Учитывая, что у вас есть INDEX(category_id, processed), практически нет никакого преимущества в том, чтобы иметь только INDEX(category_id). Таким образом, DROP последнее.

может иметь положительный побочный эффект, подталкивая оптимизатор к составному INDEX(category_id, processed), что как минимум "лучше" для запроса.

Не касаясь индексов, вы могли бы использовать FORCE INDEX с упоминанием имени составного индекса. Но я не рекомендую это. «Это может помочь сегодня, но больно завтра, после изменения данных».

Почему вы говорите: «Но я не могу изменить индекс».? Более новая версия MySQL / MariaDB делает ADD / DROP INDEX намного быстрее, чем старые версии. Кроме того, pt-online-schema-change обеспечивает быстрый путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...