SQL查询MATCH与别名和order by并优化查询

时间:2012-09-14 09:52:29

标签: mysql sql sql-order-by query-optimization match

我正在使用此查询在表格内搜索:

SELECT 
   *,
   MATCH(tags,title,description) 
      AGAINST ('hey you are you in' IN BOOLEAN MODE) AS score 
FROM table  
ORDER BY insert_datetime DESC, id DESC 

我需要的是使用别名'得分'来订购结果,这是正确的sintax吗?:

SELECT 
   *,
   MATCH(tags,title,description) 
     AGAINST ('hey you are you in' IN BOOLEAN MODE) AS score 
FROM table  
ORDER BY score DESC, insert_datetime DESC, id DESC 

还有优化此查询?更好的写作方式?

1 个答案:

答案 0 :(得分:1)

  1.   

    这是正确的sintax?

    是。正如SELECT Syntax所述:

      

    可以使用 select_expr AS alias_name 指定别名。别名用作表达式的列名,可用于 GROUP BY ORDER BY HAVING < / strong>条款。

  2.   

    还有优化此查询?更好的方式来写这个?

    如果您不需要结果集中的相关性分数,则无需选择它:

    SELECT   *
    FROM     table  
    ORDER BY MATCH(tags, title, description) AGAINST (
               'hey you are you in' IN BOOLEAN MODE
             ) DESC, insert_datetime DESC, id DESC
    

    但遗憾的是,正如ORDER BY Optimization所建议的那样,MySQL在通过MATCH() ... AGAINST()等函数的结果进行排序时无法避免进行文件排序:

      

    在某些情况下,MySQL可以使用索引来满足 ORDER BY 子句,而无需进行任何额外的排序。

         

    即使 ORDER BY 与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的 { {1}} 列是 ORDER BY 子句中的常量。

    但是,有人可以:

    • 使用WHERE子句仅筛选感兴趣的记录的结果集,从而减少必须排序的结果数;和/或

    • 通过从WHERE子句中删除不需要的列来减少每个排序步骤需要执行的最大比较次数。