1

私はこのクエリを使用してテーブル内を検索しています:

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 

必要なのは、エイリアス「スコア」を使用して結果を並べ替えることです。これは正しいシンタックスですか?:

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 

このクエリを最適化する方法もありますか?それを書くためのより良い方法は?

4

1 に答える 1

1
  1. これは正しいシンタックスですか?

    はい。SELECT構文で文書化されているように:

    Aselect_exprには、を使用してエイリアスを指定できます。エイリアスは式の列名として使用され、、、、または句で使用できます。AS alias_nameGROUP BYORDER BYHAVING

  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最適化で提案されているように、MySQLが次のような関数の結果で順序付けするときにファイルソートを実行することを回避する方法はありませんMATCH() ... AGAINST()

    場合によっては、MySQLはインデックスを使用しORDER BYて、余分な並べ替えを行わずに句を満たすことができます。

    インデックスの未使用部分と余分な列がすべて句内の定数であるORDER BY限り、インデックスがインデックスと完全に一致していなくても、インデックスを使用できます。ORDER BYWHERE

    ただし、次のことができます。

    • 句を使用して、対象のレコードのみの結果セットをフィルタリングしますWHERE。これにより、並べ替える必要のある結果の数を減らすことができます。および/または

    • ORDER BY句から不要な列を削除することにより、各並べ替え手順で実行する必要のある比較の最大数を減らします。

于 2012-09-14T10:09:10.863 に答える