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 BY
、ORDER BY
或HAVING
子句。
还有什么办法可以优化这个查询吗?更好的写法?
如果您不需要结果集中的相关性分数,则无需选择它:
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 并优化查询的主要内容,如果未能解决你的问题,请参考以下文章
sql 语句多层嵌套查询 使用别名 字段无效,如何解决(有图)