2012-03-08 4 views
3

私は、低速のクエリログに表示されるいくつかのクエリを持っているデータベースを持っています。クエリログが遅い - 1000万を超える行を調べ、EXPLAINが10,000未満を示している - なぜそんなに高いの?

2つのテーブルがあります。

TABLE1には、標準の情報と事業のテーブルです:名前、電話番号、住所、市、州、郵便番号などのカテゴリのフィールドもあります。この表には何百万と何百万もの行があります。

table2はカテゴリのテーブルです。わずか数百行あります。

問題のクエリは以下の通りです:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE table1 index indx_state,indx_city,index_category,cat_keywords PRIMARY  4 NULL 5465 946.92 Using where 
1 SIMPLE table2 ref  category_label category_label 602  my_table.table1.category 1 100.00 Using where; Using index 

は、ここで問題です:このクエリはで示し、実行するために20秒を取っている

# Query_time: 20.446852 Lock_time: 0.000044 Rows_sent: 20 Rows_examined: 11410654 
use my_database; 
SET timestamp=1331074576; 
SELECT table1.id, name, phone, address, city, state, zip 
FROM table1 
INNER JOIN table2 ON table2.label=table1.category 
WHERE state = 'tx' and city = 'San Antonio' 
and category.label LIKE 'Health Care & Medical%' group by table1.id limit 0,20; 

アンは、このようになりますクエリにEXPLAIN EXTENDED低速のクエリログとhtmlページをロードする永遠にかかる。

テーブル1の合計レコードは1,000万レコードを超えていますが、「サンアントニオ」は70,000レコードしかありません。クエリに一致するレコードの合計(制限を無視して)は数千に過ぎません。インデックスはすべてに設定されており、この事実を反映するようにEXPLAINが表示されます。

検査された行が1100万を示しているのはなぜですか?

これは、クエリがあまりにも多くドラッグされている理由の一部である必要があると思います。あなたは状態都市フィールドの複合インデックスを必要とするよう

おかげでいつものように....

+0

あなたのテーブルは本当に 'table1'と' table2'と呼ばれていません!質問を読みにくくするために名前を変更したばかりだと教えてください。そうですか? –

+0

おそらくWHERE条件に一致するものを見つけるためにテーブル全体をループする必要があるからです。 'state'と 'city'にインデックスを設定すると、リクエストがスピードアップする可能性があります。また、結合クエリを使用せずに試して、別のクエリで手動でクエリを実行することもできます。 – FMCorz

+0

設定したインデックスを入力してください。 – arnep

答えて

2

私はこの投稿にいくつかのアドバイスを行い、都市、州に関するインデックスを作成しました。私のパフォーマンスは本当に助けになりませんでしたが、別のことが助けになりました。おそらく、私が見つけた解決策は、両方の列にインデックスを置くことでより効果的になっていたでしょう。

ソリューションしかし、のUSE INDEX追加することでした:インデックスを使用するかを定義することで

http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

を、クエリ時間は1.5秒に30秒から減少しました。

私はなぜそれが働いたのかわかりませんが、それはしました。

+0

私は同じ経験をしましたが、FORCE INDEXを代わりに使用しました。 – felipou

0

は思えます。

ALTER TABLE table1 ADD INDEX(city, state); 

私はそれがより良い選択性を提供すると考えているので、私は最初のフィールドとして都市を使用しています。また、table1でルックアップテーブルと外部キーを使用し、文字列値を置き換えます。同じテーブル内で同じ文字列値を何度も繰り返し使用しないことから、パフォーマンスが向上し、サイズが縮小されます。

関連する問題