私は、低速のクエリログに表示されるいくつかのクエリを持っているデータベースを持っています。クエリログが遅い - 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万を示しているのはなぜですか?
これは、クエリがあまりにも多くドラッグされている理由の一部である必要があると思います。あなたは状態と都市フィールドの複合インデックスを必要とするよう
おかげでいつものように....
あなたのテーブルは本当に 'table1'と' table2'と呼ばれていません!質問を読みにくくするために名前を変更したばかりだと教えてください。そうですか? –
おそらくWHERE条件に一致するものを見つけるためにテーブル全体をループする必要があるからです。 'state'と 'city'にインデックスを設定すると、リクエストがスピードアップする可能性があります。また、結合クエリを使用せずに試して、別のクエリで手動でクエリを実行することもできます。 – FMCorz
設定したインデックスを入力してください。 – arnep