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

Posted

技术标签:

【中文标题】SQL 查询 MATCH 与别名和 order by 并优化查询【英文标题】:SQL query MATCH with alias and order by and optimize query 【发布时间】:2012-09-14 09:52:29 【问题描述】:

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

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 

我需要的是使用别名'score'来排序结果,这是正确的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】:

    这是正确的语法吗?

    是的。如SELECT Syntax 中所述:

    select_expr 可以使用 AS <em>alias_name</em> 指定别名。别名用作表达式的列名,可用于 GROUP BYORDER BYHAVING 子句。

    还有什么办法可以优化这个查询吗?更好的写法?

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

    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 所建议的那样,当按照MATCH() ... AGAINST() 等函数的结果进行排序时,mysql 无法避免进行文件排序:

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

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

    但是,我们可以:

    使用WHERE 子句过滤结果集以仅包含那些感兴趣的记录,从而减少必须排序的结果数量;和/或

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

【讨论】:

以上是关于SQL 查询 MATCH 与别名和 order by 并优化查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql 列别名

sql 语句多层嵌套查询 使用别名 字段无效,如何解决(有图)

SQL语句中,为啥where子句不能使用列别名,而order by却可以?

MyBatis实体属性与表的字段不对应的解决方案

PL/SQL 在插入语句的子查询中使用别名和函数

sql语句在查询分析器中能执行,但是程序却不能执行,一直报错order by 附近有语法错误