сейчас разрабатываю на одном из проектов фильтрацию и эта фильтрация должна быть по возможностям быть как у Яндекс Маркета
много динамических фильтров (если что вся таблица денормализована и все находится в одной таблице кроме 1 джоина на другую таблицу :) )
Мои вопросы:
На сколько Mysql 5.6 туп и нужно подстраивать условия WHERE a=1 AND b=1 или например WHERE b=1 AND a=1 (он под капотом сам сделает ?, а если этих условий больше 10 ?)
Сколько максимум мы можем добавить индексов ?
Как правильно построить эти индексы ? Проверь меня:
СОСТАВНОЙ ИНДЕКС
1 - самое популярное поле (допустим это признак 0/1 товар выложен/ не выложен)
2 - сортировка по этим полям (дата/цена/название)
Все может уже можно остановится ? или:
3 - следующие по популярности поле lattitude
4 - longitude
5 ...
6 ...
16 ...
и так получается что сортировок 3
значит 3 составных индекса по (4 поля) я прав ?
таким образом мы ускорим например большинство запросов
а чтобы ускорить например узкопрофильные запросы мне создать новые индексы и прописать до ограничения в 16 колонок в индексе все эти условия ? или дописать вот в предыдущие индексы сразу? (в чем я сомневаюсь ведь существует правило левого префикса, по всей видимости которое говорит порядок в условии WHERE важен)
как будет работать быстрее ?
Могу ли я построить индексы без первых четырех популярных полей ?
Также что делать если вот есть фильтрация (пример WHERE реального запроса)
((ams.seller_type = 'PRIVATE' AND ams.year >= YEAR(CURRENT_DATE()) - 14 AND ams.inspection_place_latitude BETWEEN 43.68760853 AND 46.38557461 AND ams.inspection_place_longitude BETWEEN 37.16931132 AND 40.98654368 AND ams.km_distance <= 300000 AND COALESCE(ams.is_pledged, 0) = 0 AND ams.published = 1)) ORDER BY ams.sale_started_at DESC LIMIT 50 OFFSET 900
COALESCE попадает под индекс ?
Нужно ли после ввода новых индексов выполнять Optimize Table ? ведь опитмизитор будет ходить уже по протоптаным тропам ? (или лучше использовать конструкцию FORCE INDEX в запросах)
И после того как разберемся с описанным выше
Как выстраивать индексы на OR ? (мульти фильтеринг)
WHERE (
((ams.seller_type = 'PRIVATE' AND ams.year >= YEAR(CURRENT_DATE()) - 14 AND ams.inspection_place_latitude BETWEEN 43.68760853 AND 46.38557461 AND ams.inspection_place_longitude BETWEEN 37.16931132 AND 40.98654368 AND ams.km_distance <= 300000 AND COALESCE(ams.is_pledged, 0) = 0 AND ams.published = 1))
) OR (
((ams.seller_type = 'NO PRIVATE' AND ams.year >= YEAR(CURRENT_DATE()) - 14 AND ams.inspection_place_latitude BETWEEN 43.68760853 AND 46.38557461 AND ams.inspection_place_longitude BETWEEN 37.16931132 AND 40.98654368 AND ams.km_distance <= 300000 AND COALESCE(ams.is_pledged, 0) = 0 AND ams.published = 1))
)
"На сколько Mysql 5.6 туп и нужно подстраивать условия WHERE a=1 AND b=1 или например WHERE b=1 AND a=1" -> вообще пофиг, mysql сам выберет наиболее селективное и первую очередь выберет его, потом отфильтрует по остальным "Сколько максимум мы можем добавить индексов ? " -> пока у вас место на диске не кончится, но чем больше индексов, тем дольше будет идти вставка в таблицу "Как правильно построить эти индексы ?" -> конкретизируйте, есть разные типы индексов, тут стоит смотреть подробнее, рекомендуется накидывать индексы на наиболее селективные (0\1 обычно не самый удачный вариант) " сортировок 3 значит 3 составных индекса по (4 поля) я прав ? " -> не совсем , индекс может помочь с сортировкой, но лучше все же ориентироваться на то как много запись будет отсеиваться, так же не стоит злоупотреблять составными индексами "которое говорит порядок в условии WHERE важен" -> не важен, а вот порядок полей в составном индексе уже важен все, я устал, в целом, вам стоит больше самостоятельно изучить связанную информацию, и задавать уже более конкретные вопросы )
за часть ответов спасибо буду искать как посчитать селективность индексов
порядок в условии WHERE важен Я читал что не важен.
Что такое индекс? Есть понимание?
Обсуждают сегодня