ここ数か月で、いくつかのテーブルを MYiSAM から InnoDB に移行しました。複数のWebスクレイピングインスタンスを介して個々の行を更新しているため、理論的には行ロックの利点のためにこれを行いました. 現在、slow_query_log (10 秒) に何万もの slow_queries が蓄積されています。そして多くのフルテーブルスキャン。1行の非常に単純な更新(4または5列の更新)に28秒かかるイベントがあります。(私たちの I/O と効率は非常に良好で、試行の失敗/中止は非常に低く < 0.5%)
最も頻繁に更新する 2 つのテーブルは、主キーとして ID (int 11) を持っています。InnoDB では、主キーはクラスター化されたキーであるため、ID 順にインデックス付けされたディスクに書き込まれます。しかし、列を識別する 2 つの最も重要なレコードはBillsofLading
and Container
(両方とも varchar22) です。ほとんどの DML クエリは、これら 2 つの列に基づいてレコードを検索します。また、インデックスもありBillsofLading
、container.
私が理解しているように、InnoDB はこれら 2 つのセカンダリ インデックスを作成するときに主キーも使用します。
したがって、ID
=1 とBillsofLading
='z' のレコードと、ID
=9 とBillsofLading
='a' の別のレコードを持つことができます。BillsofLading
InnoDB インデックスでは、SELECT where ='a' に基づいてレコードを更新するときに、インデックスがID
?
ここでロジックを手伝ってくれてありがとう!