170 похожих чатов

Ребят привет, нужна оч помощь прошаренных в реляционных бд Я

сейчас разрабатываю на одном из проектов фильтрацию и эта фильтрация должна быть по возможностям быть как у Яндекс Маркета
много динамических фильтров (если что вся таблица денормализована и все находится в одной таблице кроме 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))
)

4 ответов

29 просмотров

"На сколько Mysql 5.6 туп и нужно подстраивать условия WHERE a=1 AND b=1 или например WHERE b=1 AND a=1" -> вообще пофиг, mysql сам выберет наиболее селективное и первую очередь выберет его, потом отфильтрует по остальным "Сколько максимум мы можем добавить индексов ? " -> пока у вас место на диске не кончится, но чем больше индексов, тем дольше будет идти вставка в таблицу "Как правильно построить эти индексы ?" -> конкретизируйте, есть разные типы индексов, тут стоит смотреть подробнее, рекомендуется накидывать индексы на наиболее селективные (0\1 обычно не самый удачный вариант) " сортировок 3 значит 3 составных индекса по (4 поля) я прав ? " -> не совсем , индекс может помочь с сортировкой, но лучше все же ориентироваться на то как много запись будет отсеиваться, так же не стоит злоупотреблять составными индексами "которое говорит порядок в условии WHERE важен" -> не важен, а вот порядок полей в составном индексе уже важен все, я устал, в целом, вам стоит больше самостоятельно изучить связанную информацию, и задавать уже более конкретные вопросы )

Dmitry-Gerasin Автор вопроса
Сергей Кравчук
"На сколько Mysql 5.6 туп и нужно подстраивать усл...

за часть ответов спасибо буду искать как посчитать селективность индексов

порядок в условии WHERE важен Я читал что не важен.

Что такое индекс? Есть понимание?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта