Может кто-нибудь выработать более оптимизированное решение SQL?

0

Я беспокоюсь, что это немного дорого.

Плюс я скоро реализую нормализованную систему для тегов, поэтому будут дополнительные объединения.

Кроме того, у меня есть 4 таблицы (tbl_videos, tbl_articles, tbl_galleries и tbl_users), из которых я хочу отобразить три результата каждого из них и, следовательно, придется четыре раза запускать запрос при одном нажатии "поиска".

SELECT *, 
(
(CASE WHEN `description` LIKE '%hotel%' THEN 1 ELSE 0 END) + 
(CASE WHEN `description` LIKE '%london%' THEN 1 ELSE 0 END) + 
(CASE WHEN `description` LIKE '%lazy%' THEN 1 ELSE 0 END) + 
(CASE WHEN `description` LIKE '%dog%' THEN 1 ELSE 0 END) +

(CASE WHEN `title` LIKE '%hotel%' THEN 1 ELSE 0 END) + 
(CASE WHEN `title` LIKE '%london%' THEN 1 ELSE 0 END) + 
(CASE WHEN `title` LIKE '%lazy%' THEN 1 ELSE 0 END) + 
(CASE WHEN `title` LIKE '%dog%' THEN 1 ELSE 0 END) +

(CASE WHEN `tags` LIKE '%hotel%' THEN 1 ELSE 0 END) + 
(CASE WHEN `tags` LIKE '%london%' THEN 1 ELSE 0 END) + 
(CASE WHEN `tags` LIKE '%lazy%' THEN 1 ELSE 0 END) + 
(CASE WHEN `tags` LIKE '%dog%' THEN 1 ELSE 0 END)

) AS relevance
FROM `table`
WHERE `description` LIKE '%hotel%'
  OR `description` LIKE '%london%'
  OR `description` LIKE '%lazy%'
  OR `description` LIKE '%dog%' 
  OR `title` LIKE '%hotel%'
  OR `title` LIKE '%london%'
  OR `title` LIKE '%lazy%'
  OR `title` LIKE '%dog%'
  OR `tags` LIKE '%hotel%'
  OR `tags` LIKE '%london%'
  OR `tags` LIKE '%lazy%'
  OR `tags` LIKE '%dog%'
ORDER BY relevance DESC
LIMIT 0 , 3;
  • 0
    Какую проблему вы пытаетесь решить, это просто поиск в базе данных по заданному поисковому запросу? Каков процесс, у вас есть пользователи вводят данные в поле поиска, а затем что происходит?
  • 0
    Это просто стандартный поиск, да. Затем, как и в Facebook, отображается список из x номеров каждой категории; в моем случае в качестве результатов отображаются 3 пользователя, 3 статьи, 3 видео и 3 галереи.
Показать ещё 2 комментария
Теги:
optimization
search
query-optimization

1 ответ

1
Лучший ответ

Да, это, вероятно, будет довольно ресурсоемким, но похоже, что перед тем, как отправить запрос, у вас есть бизнес-уровень.

Подумайте о том, чего вы хотите достичь, и о том, что вы могли бы сделать сами, с точки зрения разбора поисковых запросов или даже предоставления отдельным полям для описания, заголовка и тэгов и правильного построения запроса, чтобы а не эффективно сказать: "У меня есть некоторые данные, похожие на этот термин поиска, где-то в столбцах этой таблицы".

После того, как вы определились в своей бизнес-логике (и если приведенный выше запрос - это то, как он заканчивается, хотя я сомневаюсь в этом, тогда sobeit), то вы должны обязательно запустить запрос через план объяснения и посмотреть, где вы можете забрать некоторые индексы, чтобы помочь базе данных.

EDIT:

Хорошо, так как это для предложения

select matched_val, relevance from (
    select description as matched_val, count(*) as relevance
    from table 
    where description like '%hotel%'
    or description like '%london%'
    or description like '%lazy%'
    or description like '%dog%'
    group by description

    union all

    select title as matched_val, count(*) as relevance
    from table 
    where title like '%hotel%'
    or title like '%london%'
    or title like '%lazy%'
    or title like '%dog%'
    group by title

    union all

    select tags as matched_val, count(*) as relevance
    from table 
    where tags like '%hotel%'
    or tags like '%london%'
    or tags like '%lazy%'
    or tags like '%dog%'
    group by tags
) as a
order by a.relevance desc
LIMIT 0 , 3

это, по крайней мере, означает, что вам нужно выполнить только одно совпадение, а не в предикате и в операторе switch, плюс оптимизатор сможет использовать индекс для описания, заголовка и тегов (которые вам понадобятся добавьте себя), и вы должны быть в отъезде.

Пойдем и посмотрим, как понравится ваш оптимизатор запросов...

  • 0
    Хм, я получаю следующую ошибку «Каждая производная таблица должна иметь свой собственный псевдоним»: S выглядит хорошо
  • 0
    См. Мое последнее редактирование для более отформатированной версии ... Возможно, вам понадобится сделать что-то вроде этого: выберите matched_val, релевантность (- все эти союзы) как порядок на a.relevance desc limit 0, 3 Я не использовал MySQL, но вы должны сделать это на сервере SQL
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню