はい、それを最適化することができます。 MySQLは変数左部分にインデックスを使用することはできませんので
まず、あなたは、LIKE
でフルスキャンを行っている(それはなく'%;car;%'
ため、';car;%'
可能です)。
第2に、SELECT
には複数のインデックスを使用しないため、rate
とtags
の2つのインデックスを使用する場合は、1つだけが使用されます。だから私はアドバイスにこれらの事に対処する
: 1.使用tags
列、 2のフルテキストインデックスINNER JOIN
を持つ2つの別々のクエリと「のり」の結果と1つのクエリを置き換える(この場合はWHERE ... AND ...
に等しいです) 。だから、最終的には
:
SELECT t1.* FROM
(SELECT * FROM yvideos WHERE rate >= 60) t1
INNER JOIN
(SELECT * FROM yvideos WHERE MATCH (tags) AGAINST ('+car +russia -usa' IN BOOLEAN MODE)) t2
USING (id);
Live example on SQLFiddle。
このクエリにはEXPLAIN
を実行し、計画を見てください。今度は完全スキャンはなく、すべてのフィルタリングはインデックスを使用して行われます。
ブール値の全文検索の詳細については、a documetationを参照してください。
現在、全文索引はInnoDBとMyISAMの両方でサポートされているので、エンジンについて判断することができます。
'レート'は数値として保存されていますか?数値の比較が速くなければならないため、WHERE rate> = '70'の代わりにWHERE rate> = 70を試すことができます。 – trevor