2012-03-12 9 views
0

IP範囲とそれに対応する国、地域(都道府県)、都市を持つ300万行のテーブルがありました。テーブルはMyISAMエンジンにありました。MySQL:MyISAMからInnoDBへの変換はクエリを高速化します...?

IPでユーザーの地理的な場所を取得するためのスクリプトを作成しました。一部のクエリでは最大17秒かかりました。その後、テーブルをInnoDBに変換してクエリ処理を再試行しました。これまでに時間のかかる問題が発生しているクエリの中には、パフォーマンスが大幅に改善され、0.02秒と短くなっています。クエリには2〜3秒かかっていましたが、約1000のIPアドレスでルックアップすることによって消費された時間は、以前のMyISAMエンジンで実行した時間の半分になりました。

私はMyISAMとInnoDBを比較してオンラインで検索しましたが、私が読んだすべての記事は、MyISAMがInnoDB on SELECTクエリより高速であると判断しました。しかし、私が見たことによると、これは私のテーブルの場合ではありません。誰にも何らかの理論がありますか?

P.S、MyテーブルにはFK制約がなく、PKはなく、IPを各行の 'ip_start'列と 'ip_end'列と比較することで検索します。 IPが範囲内にある場合、行は一致します。私のスクリプトでありますクエリの例を以下に示します。

SELECT country, region, city FROM ip_location WHERE ip_start<=1177798832 AND ip_end>=1177798832 LIMIT 1;

+2

2つのエンジンのキャッシュ/キーサイズを比較しましたか? InnoDBはMyISAMよりはるかに高い制限を受けることができます。 –

+0

@MarcBこれで、MySQLが高速アクセスのためにキャッシュに入れるデータのサイズについて話していますか? –

+0

はい、mysqlの各エンジンは、他のエンジンとは独立した独自のキャッシュ/バッファ/制限を持ちます。 innodbは通常myisamよりわずかに遅いですが、もしinnoがバッファスペースを2倍にすると、減速を隠してより速く出てくるでしょう –

答えて

2

2つのエンジンの構成を確認してください。 MyISAMの設定よりも、InnoDBエンジンの設定が検索の方が効率的である可能性があります。

重要な設定値はinnodb_buffer_pool_sizeです。InnoDBはデータ(インデックスもインデックスはありませんが)をキャッシュします。

+0

返事をありがとう、変数と両方をチェックしました "innodb_buffer_ppol_size"と "key_buffer_size" " 同じだ。 –

+0

私はクエリを「SELECT country、region、city FROM ip_location WHERE ip_start <= 1177798832 ORDER BY ip_start ASC LIMIT 1」と変更しましたが、同じ結果が得られますが、より速く(0.001s)あなたのお返事はありがとうございました!あなただけが唯一の答えであるので、私はそれを受け入れるようにします。 –

+0

@Xavier_Ex:ありがとうございました - 私はそれを感謝します。 MySQLがクエリをどのように解釈するのかを理解するには、それらにEXPLAINを使用します。あなたは得られたレポートを理解するためにいくつかの内部を学ばなければならないでしょうが、なぜ2つの異なる値の2つの比較よりも秩序が非常に速いのがわかります。 –

2

私はパフォーマンスについて、これを言うことa good article about InnoDB vs MyISAMを見つけました:

問題の クエリが主に使用している場合、クラスタ化主キーのこの技術は、MyISAMテーブルとInnoDBの間のベンチマークでかなり 大きなマージン理由の一つであります範囲のキー。 幾分 驚くべきことに、InnoDBはまだ セカンダリインデックスを使用するテストで勝っています。エンジンのパフォーマンス はキークラスタリングだけに基づくものではなく、非常にクエリに依存するパフォーマンスの向上 を示しています。

InnoDBは、インデックスを持つ他のトリックも使用します。 頻繁なクエリに対して 「適応ハッシュインデックス」を構築し、 テーブル全体がメモリに近づくときにそうする[5]これらのハッシュインデックス は、テーブル がメモリ内にある場合、標準のBTreeインデックスよりかなり高速です。この場合も、メモリ使用量を犠牲にして、これは別の重要なパフォーマンスである改善点です( )。

あなたのテーブルには、かなり大きな聞こえるので、私はそれがメモリ内に完全に開催されてい疑うが、InnoDBはとにかくMyISAMテーブルよりも優れたインデックスを扱うように聞こえる、プラスあなたがそう特定されているので、その結果をキャッシュすることができますクエリ。

関連する問題