Может кто-нибудь выработать более оптимизированное решение SQL? - PullRequest
0 голосов
/ 14 января 2010

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

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

Кроме того, у меня есть 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;

1 Ответ

1 голос
/ 14 января 2010

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

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

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

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, плюс оптимизатор сможет использовать индекс для описания, заголовка и тегов (который вам потребуется добавь себя) и ты должен быть в отъезде.

посмотрите, как вашему оптимизатору запросов это нравится ...

...