任何人都可以找到更优化的SQL解决方案吗?

时间:2010-01-14 10:19:04

标签: mysql optimization search query-optimization

我担心这有点贵。

另外,我很快就会为标签实现标准化系统,因此会有额外的连接。

最重要的是,我有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 个答案:

答案 0 :(得分:1)

是的,这可能会非常耗费资源,但听起来您在提交查询之前就有一个业务层。

考虑一下你想要实现什么,以及你自己可以做什么,在解析搜索术语方面,甚至为用户提供描述,标题和标签的单独字段,并适当地构建查询,以更直接地查询,而不是有效地说,“我有一些数据非常像这个搜索词,在这个表的列中的某个地方。”

一旦你确定了你的业务逻辑(如果上面的查询是如何结束的,虽然我怀疑它,然后sobeit),那么你应该通过解释计划运行查询,看看你可能会在哪里找到一些索引来帮助数据库。

编辑:

好的,这对于一个建议是怎么回事

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语句中,加上优化器就可以在描述,标题和标签上使用索引(你需要它添加自己)你应该离开。

快来看看你的查询优化器是怎么喜欢的......