для приложения)
Вместо count() может быть так же выборка по конкретным колонкам
SELECT count(*)
FROM `data`
JOIN data_container on data_container.id = data.data_container_id
WHERE `data`.`deleted_at` IS NULL AND
// эта часть запроса захардкожена
(data.status = 2) AND (data_container.closed = false) AND (data.price > 0) AND
// эта часть прилетает из фильтров
((data.price BETWEEN 15 AND 25) AND
(data.col1 LIKE '%') AND
(data.col2 LIKE '%') AND
(data.col3 LIKE '%') AND
(data.col4 LIKE '%') AND
(data.col5 IN (SELECT DISTINCT col5 from data where deleted_at IS NULL AND status = 2 AND price > 0)) AND
(data.col6 IN (SELECT DISTINCT col6 from data where deleted_at IS NULL AND status = 2 AND price > 0)) AND
(data.col7 IN (SELECT DISTINCT col7 from cards where deleted_at IS NULL AND status = 2 AND price > 0)) AND
С клиента приходят значениями col1-col4. Их я пихаю в LIKE (если пусто, то LIKE "%", если НЕ пусто, то LIKE "%client_data")
С клиента приходят массивом значений col5-col7. Их я пихаю в IN (если массив пустой, то все выглядит как в подзапросе выше, если массив не пустой, то в конце подзапроса будет дополнительный IN(...), в который распиханы пользовательские данные)
По итогу запрос работает, но достаточно долго (в райне 1 минуты 5 секунд для выборки в 65 тыс записей.)
1) Если из запроса убрать JOIN, то он быстрее выполняеться (1.23 сек), но этот join мне нужен
2) Нашел еще одно место, где его можно оптимизировать - убрать 1 любой LIKE (1.15 сек).
Но ни один из вариантов не подходит т.к. фильтровать нужно по всем данным, которые щас в запросе есть...
Вопрос у меня следующего характера - Как это оптимизировать это?
Надо смотреть сами данные уже, ибо первое что приходит в голову - отказаться от LIKE и перейти к равенству значений, если это возможно. Либо приводить значение пользователя к множеству возможных значений и их искать - так тоже будет быстрее, нежели лайкать.
Ещё вариант: разбить запрос на два: первый ищет через лайк варианты а потом уже полученные варианты используются во втором запросе.
Ну, э, не надо так делать
Почему?) Хотя, безусловно, всё зависит от логики приложения
Ну вот мне тоже like не ноавится
Это, прежде всего, группа разных запросов, и каждый надо рассматривать отдельно
Особенно мне понравилась это: (data.col1 LIKE '%') AND (data.col2 LIKE '%') AND (data.col3 LIKE '%') AND (data.col4 LIKE '%') AND ... Это просто шедевр!
Который из пяти?
Обсуждают сегодня