2012-09-14 60 views
1

我使用這個查詢來搜索內部表:SQL查詢匹配的別名和ORDER BY和優化查詢

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
  1. 這是正確的sintax?

    是的。作爲SELECT Syntax下記載:

    select_expr可以給出使用AS alias_name的別名。別名用作表達式的列名,並且可以在GROUP BY使用,ORDER BY,或HAVING條款。

  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 CLA沒有做任何額外的排序使用。

    該指數還可以甚至用如果ORDER BY沒有索引完全相同,只要所有索引的未使用的部分和所有的額外ORDER BY列是WHERE子句中的常數匹配。

    然而,一個可能:

    • 過濾器中的結果對於那些只使用WHERE條款,從而減少了必須進行排序的結果數量的興趣記錄;和/或

    • 通過從ORDER BY子句中刪除不需要的列來減少每個排序步驟需要執行的最大比較次數。