sql >> データベース >  >> RDS >> Mysql

MySQLの複合FULLTEXTインデックス

    @Alden Quimbyの答えは、それに関する限り正しいですが、MySQLは試行するだけなので、話にはそれ以上のものがあります。 最適なインデックスを選択し、フルテキストインデックスがオプティマイザと相互作用する方法のために、その決定を行う能力が制限されます。

    実際に起こることはこれです:

    指定されたuser_idがテーブル内の0または1の一致する行に存在する場合、オプティマイザーはこれを認識し、そのクエリのインデックスとしてuser_idを選択します。高速実行。

    それ以外の場合、オプティマイザはフルテキストインデックスを選択し、フルテキストインデックスと一致するすべての行をフィルタリングして、WHERE句に一致するuser_idを含まない行を削除します。それほど速くはありません。

    したがって、それは本当に「最適な」パスではありません。これは全文に似ており、テーブルにほとんど関心がないことがわかっている1つの条件で全文検索を回避するための優れた最適化が施されています。

    これが機能しなくなる理由は、フルテキストインデックスがオプティマイザに意味のある統計を返さないためです。 「ええ、クエリはおそらく1行をチェックするだけでよいと思います」とだけ書かれています...もちろん、オプティマイザを大いに喜ばせるので、整数のインデックスでない限り、フルテキストインデックスが最低コストで入札に勝ちます値も比較的低いか低いです。

    それでも、それは私が最初にこの方法でそれを試さないという意味ではありません。

    IN BOOLEAN MODEの全文クエリで最適に機能する別のオプションがあります。 これは、CONCAT('user_id _'、user_id)などを入力する別の列を作成してから、2列のフルテキストインデックスを宣言することです。

    filter_string VARCHAR(48) # populated with CONCAT('user_id_',user_id);
    ....
    FULLTEXT KEY (message,filter_string)
    

    次に、クエリですべてを指定します。

    SELECT ...
     WHERE user_id = 500 AND
     MATCH (message,filter_string) AGAINST ('+kittens +puppies +user_id_500' IN BOOLEAN MODE);
    

    これで、フルテキストインデックスは、子猫、子犬、および「user_id_500」が2つの列の結合されたフルテキストインデックスに表示される行のみを照合する役割を果たしますが、整数フィルターを使用して、メッセージに「user_id_500」がランダムに表示されても、最終的な結果は制限されます。



    1. MariaDBとは何ですか? MariaDBはどのように機能しますか?

    2. 同じテーブル内の子レコードを削除するMySqlトリガー

    3. OracleSQLでの日付の平均化

    4. Zend_Dbで複数の行を追加するにはどうすればよいですか?