2016-08-17 2 views
1

У меня есть таблица со следующими полями: id, sex, age_min, age_max, url.Как индексировать таблицу с диапазонами?

Эта таблица будет отфильтрована по полу, возрастному диапазону и идентификатору. Общий запрос будет:

SELECT `url` FROM foo WHERE (`id` NOT BETWEEN %lim_1% AND %lim_2%) 
AND `sex`=%sex% 
AND `age_min` <= %age% AND `age_max` >= %age% 

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

+0

Я думаю, что это должно быть 'id'. –

+0

@ HamzaZafeer просто 'id'? Я думал о добавлении индексов ко всем полям, кроме 'url', но я не знаю, как MySQL это справится. И, возможно, есть что-то делать с возрастом. –

+0

IMO это может быть лучше размещено на DBA.stackexchange.com, так как речь идет о соображениях дизайна, а не о программировании. –

ответ

2

Этот вид запроса трудно ускорить с помощью индекса; фильтрация age_min <= %age% AND age_max >= %age% не может быть реорганизована планировщиком запросов или программистом в аккуратное небольшое сканирование индекса индекса.

Итак, вы должны создать индекс покрытия и надеяться на лучшее.

У вас есть фильтр равенства на sex = %sex%, так что столбец должен вести указатель.

У вас есть фильтры диапазона полусканирования на age_min и age_max. Если вы знаете, что один из них более избирательный, чем другой, выберите его в следующем столбце в индексе. В противном случае выберите один из двух.

Затем включите остальные столбцы таблицы в индекс. Таким образом, вы получите

(sex, age_min, age_max, id, url) 

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

Примечание. Если вы не включаете в фильтр sex = %sex%, этот индекс становится бесполезным для удовлетворения этого запроса.

Примечание. MySQL почти никогда не может использовать более одного индекса для удовлетворения одного предложения WHERE. Таким образом, размещение индексов с одним столбцом на множестве столбцов почти никогда не является хорошей идеей.

Примечание. Если таблица содержит менее нескольких сотен строк, индексирование ее не может повредить, но, вероятно, не поможет.

+0

@ 2-я нота - «почти»? Когда MySQL использует более одного индекса для одного предложения WHERE? –

+1

«Никогда» - это экстремальное утверждение, особенно для системы с открытым исходным кодом, находящейся в активной разработке. Следовательно, «почти никогда». –

+0

Я бы сказал, что «слияние индекса» используется менее одного раза в тысячу. 'EXPLAIN SELECT ...' ясно показывает, когда он его использует. –

Смежные вопросы