2010-12-18 3 views
1

毎週スパムをチェックし、「%http://%%id desc limit 10 by orderいくつかの他のキーワード。最近の選択は非常に遅いです。唯一の違いは、それは私のネットブックで唯一の1.3ミルの投稿があり1であるとして「ROWS」欄を示している1ギガのRAMを搭載した私のネットブックで非常に遅いクエリが本当に高速でした。 Explainはローカルバックアップで行= 1を示しますが、サーバー上の行= 2287359

mysql> explain select * from posts where reply like "%http://%" order by id desc limit 1; 
+----+-------------+-----------+-------+---------------+---------+---------+------+---------+-------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+-----------+-------+---------------+---------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | posts  | index | NULL   | PRIMARY | 4  | NULL | 2287347 | Using where | 
+----+-------------+-----------+-------+---------------+---------+---------+------+---------+-------------+ 
1 row in set (0.00 sec) 

。サーバーには6ギグラムと高速プロセッサーがあります。最適化する必要があるので、恐ろしく遅くはありません。最近、私はuserIdで検索するためのインデックスを追加しました。これは賢明な選択肢ではありませんが、この問題が起きる少し前にバックアップとプロダクションサーバーに追加しました。私はそれが釣れなかったためにラムで並べ替えることができないことに関連していると思いますか?

「threadId = Xの投稿からの削除」のようなものを実行すると、遅くなるようですが、関連していれば無駄です。

+1

テーブル(インデックスを含む)のCREATEステートメントを表示できますか? – enobrev

答えて

2

、MySQLはすぐにあなたが探しているものを見つけるためにreplyにインデックスを使用することはできませんでしょう。さらに、idが最大のものを求めているので、MySQLはすべての結果を取得して、最大の `id 'を持つものがあることを確認する必要があります。 replyで構成されてどのようpostsテーブルのデータの多くによっては

(id, reply)に複合インデックスを追加し、(

SELECT id FROM posts WHERE reply LIKE "%http://%" ORDER BY id DESC LIMIT 1

のようなものにクエリを変更する価値があるかもしれません索引のみの実行を行います)、次にポストテーブルに参加するか、取得したidを使用してポストを取得します。クエリにindex only executionがあり、インデックスがメモリ内に収まる場合は、通常の使用または意図的なウォームアップにより、メモリにがすでに格納されているため、クエリの実行が高速化される可能性があります。

同一のデータを持つ2つの同一のサーバーで同一のクエリが異なる実行計画と実行時間を与えている場合は、OPTIMIZE TABLE postsでインデックス統計情報を更新したり、テーブルの最適化を行う必要があります。最近インデックスを追加/削除している場合は、迷子になっている可能性があります。さらに、データがフラグメント化されている場合、PRIMARY KEYの順序で行を引っ張っているときに、ディスク全体にジャンプしてデータを取得する可能性があります。

DELETE FROM posts WHERE threadId=Xに関しては、にインデックスがある限り、問題はありません。

1

テーブルにはどのようなインデックスがありますか?経験則として、WHERE句に最も頻繁に表示される列にインデックスを付けることをお勧めします。あなたのthreadId列にインデックスがない場合、最後のクエリは実行した場合よりもはるかに遅くなります。

最初のクエリ(「%http://%」のような投稿がクエリの「like」のため単純に遅くなる投稿から選択する*別のWHERE句でクエリをフィルタリングすることをお勧めします。 (うまくいけばインデックス付けされます)日付:あなたは「%」で検索比較を開始した場合

select * from posts where postdate > 'SOMEDATE' and post like '%http://%' 
+0

なぜ「どこでも」LIKEが悪い:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning –

+0

つまり、説明クエリでは、 2287347を示し、バックアップの説明では行= 1を示しています。私は両方で "限界1"を使用しますが、サーバー上の何らかの理由ですべてをロードしているか、すべてを検索しています。以前はクエリが高速でした。 ID descで注文する私は、通常、主キーのときにソートする必要がないので、より高速です(私は信じています、確信していません!)。 – ForeverConfused

+1

FORCE INDEXを試すことができますか? http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/; http://dev.mysql.com/doc/refman/5.1/ja/index-hints.html – Tim

2

インデックスが使用されることはありませんがあなたの問題は、あなたの説明によって確認されたように

where reply like "%http://%" 

でありますインデックスは使用されません。キャッシングによる速度差があります。

1

部分文字列 'http://'を検索するテキストを調べ、現在のレコードにフラグを立てるか、そのIDをSPAMテーブルに書き出すトリガーを書き込むことができますか? @brentによると、インデックスは "contains substring"検索には使用されません。原因http://の両側にワイルドカードへの

SELECT * FROM posts WHERE reply LIKE "%http://%" ORDER BY id DESC LIMIT 1

に関して

関連する問題