私は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を処理しています。
フィードバックに感謝します。
SELECTの可能性は、セカンダリインデックスの原因に通常であれば、私はユニークな長い文字列を必要とするので、私が代わりにCHR文字列の(32)MD5をやっているアプリケーションにキャッシュレベルを追加します。 UPDATEは常に主キーによって行われます。基本的に私が行うことは、INT変数を作成する関数を作成することです。次に、 'SELECT id FROM tbl WHERE md5 = oMD5 LIMIT 1'に設定します。この時点で1がNULLの場合は挿入します。それ以外の場合は、IDを更新する行の統計情報をいくつか更新します。 –
賢明なビルド、Windows x64で5.5を実行しています –
MySQLサーバーをLinuxに移行することを検討してください。その違いは甚大である可能性があります。私の経験はMySQL 5.0であり、最近のバージョンで改善されていると聞きましたが、MySQLはまだLinux上で動作するように最適化されています。多くの最適化(Perconaサーバーなど)は、Windows上でもサポートされていません。 – sagi