2016-07-26 13 views
0

私は200万の行を持つMysqlテーブルを持っています。 サイズは600Mbです。2百万行のテーブルの速度が遅くなります

このクエリには2秒かかります。 私はそれをスピードアップする方法を知らない。テーブルは既にMyisam形式です。 私は選択カウントの遅さの限界に達したかどうかわかりません。

SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%' 

おかげで、すべての

+0

'レート'は数値として保存されていますか?数値の比較が速くなければならないため、WHERE rate> = '70'の代わりにWHERE rate> = 70を試すことができます。 – trevor

答えて

0

はい、それを最適化することができます。 MySQLは変数左部分にインデックスを使用することはできませんので

まず、あなたは、LIKEでフルスキャンを行っている(それはなく'%;car;%'ため、';car;%'可能です)。

第2に、SELECTには複数のインデックスを使用しないため、ratetagsの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の両方でサポートされているので、エンジンについて判断することができます。

関連する問題