2011-07-18 12 views
2

私はmySQLデータベースに関数呼び出しを送信するアプリケーションを持っています。一度送信されると、関数は必要な処理(1行の選択、インデックスによるINSERTおよびUPDATEを含む)を行います。MySQLのInnoDB:インデックスロック - アドバイスが必要

今は約100万回のmySQLコールを実行できます。これらのmySQL関数呼び出しは、アプリケーションの実際の "呼び出し"に分解され、1から20の異なるmySQL関数呼び出しが可能です。私のアプリは1日に約12万件の「アプリ関数呼び出し」を取得しています。

私は12ギガのRAMを持っていますので、InnoDBメモリ内RAMを2ギガから8ギガに増強しましたが、それは増加していません。次に、スレッドが1つ増えれば、スレッドを増やすとそれが増えると思いました。だから、私はこれをやった、そして今私はトンとインデックスロックのエラーのトンを見ている。

MySQLは単純に要求を再送すると言いますが、動作しますが、速度はそれほど向上しません。私は基本的に180,000の "アプリケーション関数呼び出し"スレッドに関係なく、私の最後に1つのスレッドが約120,000だったときに最大です。これは、いったん私が約2-3スレッドを持つと、その定数スレッドロックエラーです。

私のテーブルには、何百万という行があるので、検索効率の指標がたくさんあります。しかし、私はこのデータベースを複製して、新しいインスタンスがSLAVEでほとんどの検索を行い、メインデータがMASTER(すべての更新/挿入)で維持されるようにする予定です。このため、主キー以外のすべてのインデックスを削除し、ユニークキーでこれを減らすことを考えていましたか?次に、SLAVEにインデックスを追加することができました。しかし、索引が異なる場合、mySQLの基本的なREPLICATION機能を使用するとこれが動作するかどうかはわかりません。

これをより効果的にするために私が何をすべきかについての提案。今のところ、MySQLは特定の日に必要なものの約1/20を処理しています。

フィードバックに感謝します。

答えて

0

できるだけ効率が良いことを確認するには、クエリのプロファイルを作成する必要があります。組み込みの実行計画の記述プロセス(EXPLAIN、またはMySQL Management ConsoleのExecution Planビジュアライザ)を使用すると、クエリがどこに行き詰まっているのかを把握するのに役立ちます。

ハードウェアソリューションに関しては、インメモリを完全に実行していない場合は、ディスクをSSDにアップグレードすることを検討してください。それらが提供するスループットは非常に重要です(回転錆より2桁大きいIOPS)。

0

実行中のMySQLのバージョンは?最近のMySQLのバージョンでは、InnoDBの同時実行性が大幅に向上しました。また、Percona MySQLビルドを試してみることもできます。

テーブルの構造とクエリの見た目についてさらに詳しく説明できますか? INSERTとUPDATEがインデックスであるとすると、プライマリキーまたはセカンダリインデックスを意味しますか?

+0

SELECTの可能性は、セカンダリインデックスの原因に通常であれば、私はユニークな長い文字列を必要とするので、私が代わりにCHR文字列の(32)MD5をやっているアプリケーションにキャッシュレベルを追加します。 UPDATEは常に主キーによって行われます。基本的に私が行うことは、INT変数を作成する関数を作成することです。次に、 'SELECT id FROM tbl WHERE md5 = oMD5 LIMIT 1'に設定します。この時点で1がNULLの場合は挿入します。それ以外の場合は、IDを更新する行の統計情報をいくつか更新します。 –

+0

賢明なビルド、Windows x64で5.5を実行しています –

+0

MySQLサーバーをLinuxに移行することを検討してください。その違いは甚大である可能性があります。私の経験はMySQL 5.0であり、最近のバージョンで改善されていると聞きましたが、MySQLはまだLinux上で動作するように最適化されています。多くの最適化(Perconaサーバーなど)は、Windows上でもサポートされていません。 – sagi

0

1 - おそらく、テーブルを分割しようとする必要があります。これにより、ロックする必要のあるインデックスの部分のサイズが小さくなります。 http://www.youtube.com/watch?v=Oon06s9dXrY

3 - -

2つの異なる作業のシナリオであなたのスレッドを分離するようにしてください。 1つのタイプの操作(たとえば、オーダー登録)用の1つのスレッド、他のタイプの操作用の1つのスレッド(許可チェック用)。これにより、並行性レベルが大幅に低下する可能性があります。

4 -

関連する問題