Этот вид запроса трудно ускорить с помощью индекса; фильтрация age_min <= %age% AND age_max >= %age%
не может быть реорганизована планировщиком запросов или программистом в аккуратное небольшое сканирование индекса индекса.
Итак, вы должны создать индекс покрытия и надеяться на лучшее.
У вас есть фильтр равенства на sex = %sex%
, так что столбец должен вести указатель.
У вас есть фильтры диапазона полусканирования на age_min
и age_max
. Если вы знаете, что один из них более избирательный, чем другой, выберите его в следующем столбце в индексе. В противном случае выберите один из двух.
Затем включите остальные столбцы таблицы в индекс. Таким образом, вы получите
(sex, age_min, age_max, id, url)
в указателе. Планировщик запросов может сканировать только часть этого индекса, а затем удовлетворить запрос из индекса. Если вы посмотрите , охватывающий индекс, вы можете узнать больше об этой технике.
Примечание. Если вы не включаете в фильтр sex = %sex%
, этот индекс становится бесполезным для удовлетворения этого запроса.
Примечание. MySQL почти никогда не может использовать более одного индекса для удовлетворения одного предложения WHERE
. Таким образом, размещение индексов с одним столбцом на множестве столбцов почти никогда не является хорошей идеей.
Примечание. Если таблица содержит менее нескольких сотен строк, индексирование ее не может повредить, но, вероятно, не поможет.
Я думаю, что это должно быть 'id'. –
@ HamzaZafeer просто 'id'? Я думал о добавлении индексов ко всем полям, кроме 'url', но я не знаю, как MySQL это справится. И, возможно, есть что-то делать с возрастом. –
IMO это может быть лучше размещено на DBA.stackexchange.com, так как речь идет о соображениях дизайна, а не о программировании. –