Задать вопрос

Из-за чего большое время выполнения скрипта при поиске в MySql с использованием LIKE и ORDER?

Есть база с товарами, данные каталогизации хранятся в дополнительных таблицах.
Использование сортировки ORDER BY -обязательно,
Использование поиска(LIKE) - обязательно,

При соблюдении обоих условий, время выборки - 8-9 сек.
При исключении одного условия время сокращается до 0.03 - 0.04 сек.

SELECT `product`.* FROM `product`
LEFT JOIN `productType` ON productType.id = product.productTypeId
LEFT JOIN `catalogProduct` ON catalogProduct.id = productType.catalogId
WHERE (catalogProduct.list like '%|1|%')
ORDER BY product.id DESC LIMIT 10;

Помогите ускорить запрос, или укажите на явные ошибки
  • Вопрос задан
  • 2951 просмотр
Подписаться 4 Оценить 1 комментарий
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
или укажите на явные ошибки

Вот здесь:
catalogProduct.list like '%|1|%'

Толпа идентификаторов, разделённых | ?
Это явная ошибка. Full scan быстрым бывает в одном случае - таблица очень мелкая, буквально пара записей.

Вынесите эти идентификаторы в отдельную нормальную таблицу-связку.

Мелкая ошибка - зачем left join, если требуете join? catalogProduct.list по вашему where не может быть null'ом.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Mandor
@Mandor
На правах капитана:
1. Проблема в LIKE
1.а. Проблема в вот этом символе (я выделил жирным) "like '%|1|%'"

В данном случае наличием "%" в начале строки убивается всякая возможность использовать поиск по индексу этого поля.

2. +1 за FULLTEXT, но он работает только на MyISAM (если за последнее время ничего не изменилось).
Ответ написан
mgyk
@mgyk
Запросы вида '%something%' не используют индекс, у вас всегда будет полный перебор таблицы.
Если у вас catalogProduct таблица меньше таблицы product
Разбейте на два запроса, первым нужно вытащить productType.id

SELECT productType.id FROM catalogProduct
LEFT JOIN `productType` ON productType.catalogId = catalogProduct.id
WHERE catalogProduct.list like '%|1|%'

SELECT `product`.* FROM `product`
WHERE product.productTypeId IN (ids)
ORDER BY product.id DESC LIMIT 10;
Ответ написан
Комментировать
@udi
Если есть архитектурная возможность - попробуйте FULLTEXT, будете приятно удивлены скоростью.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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