10

約 500,000 行を含む (現在 InnoDB) テーブルがあります。これは、実行するタスクのキューを表します。MySQL データベースに保存されます。

少なくとも 1 秒に 1 回、場合によってはより頻繁に継続的に、そこからデータを選択し、続いていくつかの行を更新します。1 日に 1 回、テーブルから古い行を削除します。

テーブルでデッドロックが発生し始め、これによりタスク処理が停止しました。これらのデッドロックは、夜間の prune 実行中に発生しました。DELETE、SELECT、および UPDATE の組み合わせは、本質的に何も生産的ではないことを意味していました。残念ながら、SHOW ENGINE INNODB STATUS の出力がありません。

これに対処するための最良の選択肢を知りたいです。コードがデッドロックを検出し、クエリを再発行することに注意してください。また、一致するすべての行を一度に削除すると、多くのアクティビティが見られるデータベース テーブルに負担がかかりすぎることをずっと前に発見したため、一度に削除を 10,000 行に制限し、必要なすべての行が削除されるまでクエリを再発行し続けます。剪定した。

次のオプションが表示されます。どれが最適かについての意見や、他のオプションの提案を希望します。

  1. 一度に削除する行数を減らす
  2. DELETE で指数バックオフを使用しますが、特定のワークロードを考えるとこれが役に立たないことを懸念しています
  3. MySQL のドキュメントに従ってテーブルをロックします。おそらく、削除中は SELECT ステートメントと UPDATE ステートメントをブロックすることを受け入れることができます。
  4. MyISAM テーブル タイプに切り替えます。最初はこのテーブルでトランザクションを使用していたため、InnoDB を使用しました。これはもはや当てはまりません。これが実行可能な解決策であるかどうかを知るには、詳細に精通していません。
  5. おそらくUPDATE LOW_PRIORITYを使用してください。DELETE は SELECT には影響せず、UPDATE のみに影響する可能性があり、これで十分な場合があります。
4

2 に答える 2

6

DML操作を実行するとき、InnoDBスキャンされたすべての行をロックし、一致しませんでした。

次のテーブル レイアウトを検討してください。

DROP TABLE t_tran;

CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;

DROP TABLE t_tran;

CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;

INSERT
INTO    t_tran
VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8);

START TRANSACTION;

DELETE
FROM    t_tran
WHERE   data = 2
        AND id <= 5;

この場合、 は、onよりも安価であると見なされるアクセス パス onMySQLを選択します。RANGEidREFdata

並行トランザクションでは、行6、を削除または更新できますが、行はロックされているため (行のみが影響を受けたにもかかわらず) 削除または更新できません。78152

上記の条件から外せばid <= 5、 row 以外のすべての行を削除できます3

残念ながら、運用MySQLでアクセスパスを制御することはできません。DML

あなたができる最善のことは、条件を適切にインデックス付けし、MySQLこれらのインデックスが選択されることを期待することです.

于 2009-08-20T15:57:08.347 に答える
2

トランザクション分離がコミット済み読み取りとしてマークされ、反復可能読み取りとしてマークされていないことを確認してください。Read commited がデフォルトである必要がありますが、私たちのサーバーでは、innodb のデフォルトが反復可能な読み取りであることがわかりました。

次のコマンドを実行して確認できます。

SHOW VARIABLES LIKE 'tx%';

これを設定するには、my.cnf ファイルに次の行を入力します。

tx_isolation=READ-COMMITTED
于 2009-08-20T15:41:32.810 に答える