нетипичный запрос, необходимый индекс, оптимизация

0
select ip.ns, ip.u from iparts ip where ip.isF = 0 and ((ip.wl < ?1 and ip.wl > ?2) or (ip.wf = 0 and ip.c < ?1 and ip.c > ?2))

ip.isF = 0 - эта часть является наиболее избирательной, 95% записей имеет isF = 1, но эта таблица будет действительно большой

Как оптимизировать этот запрос? Не могли бы вы уточнить, какой индекс я должен добавить в table-iparts?

Теги:
indexing
query-optimization

1 ответ

1
Лучший ответ

Следующие индексы должны быть полезны для вашего запроса:

('isF','wl')

('isF','wf','c')

Добавление столбцов SELECTed улучшит его еще больше, сделав эти индексы покрывающими индексы и, таким образом, позволит использовать только индекс, без необходимости искать основную таблицу.

('isF','wl','ns','u')

('isF','wf','c','ns','u')

Единственным недостатком использования этой пары индексов в отличие от другой пары является то, что время вставки может быть немного медленнее из-за дополнительных столбцов, и эти индексы занимают больше места.

Я бы также предложил изменить ваш запрос, чтобы максимально использовать эти индексы.

SELECT ip.ns,
ip.u 
FROM iparts ip 
WHERE ip.isF = 0 
AND ip.wl < ?1 
AND ip.wl > ?2
UNION DISTINCT
SELECT ip.ns,
ip.u 
FROM iparts ip 
WHERE ip.isF = 0 
AND ip.wf = 0 
AND ip.c < ?1 
AND ip.c > ?2

Используя UNION, РСУБД может делать каждый запрос отдельно, используя только индекс, соответствующий каждому запросу. Если у ваших данных не будет дубликатов между двумя запросами, вы можете изменить UNION DISTINCT в UNION ALL и сэкономить еще немного времени.

Примечание. Вам не нужны обе пары индексов. Я предлагаю попробовать первую пару (более короткие) и посмотреть, приемлема ли производительность (не забудьте использовать мой запрос.) Если это не достаточно хорошо, отбросьте их и добавьте вторую пару.

Если вам нужна дополнительная помощь, добавьте в свой вопрос вывод SHOW CREATE TABLE iparts. Это позволит нам видеть существующие индексы и типы данных столбцов, которые имеют отношение к любой оптимизации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню