2011-10-25 22 views
5

基本的に私たちはMysqlsのパフォーマンスに非常に満足しています。同様のクエリは分割して完了します。今度はこのクエリの問題に直面するMySqlsのパフォーマンスを低下させる原因は何ですか?

SELECT dc.id,dmr.art_id 
FROM dmr 
JOIN dma ON dma.id = dmr.dml_id 
JOIN dc ON dc.id = dma.dc_id 
WHERE dmr.art_id = 2285 

5021行をフェッチするのに50秒かかる。索引の不足は、おそらくそのような問題の最も一般的な原因です。だから私はEXPLAINでクエリを先行させ、インデックスだけが逐次スキャンを使用しないことを示すこのクエリプランを得ました。

表dmrおよびdmaにはそれぞれ300万行があり、dcには6000行があります。

+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 
| id | select_type | table | type | possible_keys     | key   | key_len | ref    | rows | Extra  | 
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 
| 1 | SIMPLE  | dmr | ref | FKC33D5199F17E1825,ix_art_ref | ix_art_ref  | 5  | const    | 5021 | Using where | 
| 1 | SIMPLE  | dma | eq_ref | PRIMARY,FK8C6E1445153BBDC9 | PRIMARY  | 8  | dev.dmr.dml_id  | 1 |    | 
| 1 | SIMPLE  | dc | eq_ref | PRIMARY      | PRIMARY  | 8  | dev.dma.dc_id  | 1 | Using index | 
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 

この問題の原因は何ですか?

MySqlバージョンはInnoDBをエンジンとして使用して5.5です。 (ウィンドウのデフォルトパラメータのみ)。

I削除

EDIT句は、MySQLは(巨大)は直ちに結果セットを返す場合。この場合、 クエリプランは次のようになります。

+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
| id | select_type | table | type | possible_keys    | key    | key_len | ref  | rows | Extra     | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
| 1 | SIMPLE  | dc | index | PRIMARY     | FKAEB144C64FA71464 | 9  | NULL  | 4037 | Using index    | 
| 1 | SIMPLE  | dma | ref | PRIMARY,FK8C6E1445153BBDC9 | FK8C6E1445153BBDC9 | 9  | dev.dc.id | 263 | Using where; Using index | 
| 1 | SIMPLE  | dmr | ref | FKC33D5199F17E1825   | FKC33D5199F17E1825 | 9  | dev.dma.id | 1 | Using where    | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
+0

あなたにハード・ディスクに接続されている可能性が最も高いI/Oです。 'innodb_buffer_pool'サイズ変数をRAMの70%に増やしてください。このようにして、作業データセットの一部がメモリに保持され、参照がはるかに高速になります。 –

+0

テーブルを分析しよう... http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html –

+0

@Neville - 私はすでに行っています、ステータスは大丈夫です。 – stacker

答えて

0

mysql 5.5.17を再インストールして問題を解決し、「Developer Machine」の設定を使用しないことにしたので、「Server Machine」のデフォルト設定を使用しました。 その後、数秒(1回目)のクエリでクエリが実行された後に、 の方がはるかに優れています。

デベロッパーモードでは、mysqlはラムを保存するように設定されており、大きなテーブルでは十分なインデックスページをバッファしません。

(再)設定することができますMYSQL_HOME/bin/MySQLInstanceConfig

enter image description here

古いものと新しい設定ファイルの比較ですが、これらの値は、設定時に変更されたことを示して達成することにより:

tmp_table_size=103M old 18M 
myisam_sort_buffer_size=205M old 35M 
key_buffer_size=175M old 25M 
innodb_additional_mem_pool_size=7M old 3499K 
innodb_additional_mem_pool_size=2M old 1M 
innodb_buffer_pool_size=339M old 47M 
+0

コメントに示唆されているように、あなたの 'innodb_buffer_pool'が増えました。 my.cnfファイルを編集して手動で実行することも、そのGUIを使用してインスタンスを再設定することもできます。いずれにしても、作業データセットは現在メモリに常駐しています。言い換えれば、それはまだ時々遅いかもしれません。 –

+0

@ N.B。申し訳ありませんが、私はあなたが「作業データセット」の意味を理解していませんでした。答えとしてあなたのコメントを投稿すれば、私はそれを受け入れます。ご協力いただきありがとうございます。 – stacker

+0

それは大丈夫です、私は担当者のために "狩り"ではない、あなたの答えとコメントは、同じ問題を持つ次の男のために物事を明確にする:) –

1

たぶんテーブルは非常に断片化され、MySQLはそれらの5021行をフェッチするために、すべてのディスクの上に行かなければなりませんか?

関連する問題