Values
への挿入をブロックすることなく、Values
テーブルのカウントまたは合計でTotals
テーブルの行を増分更新できることに興味があります。ロックの値を持たないcountとcursorを持つMySQLアップデートの合計テーブル
アイデアが総チェックポイントより大きいすべての値を収集し、合計カウントとチェックポイントを更新することです。これにより、スナップショットがTotals
に作成されます。ここではテーブルは以下のとおりです。
Table: Totals
Create Table: CREATE TABLE `Totals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`count` int(11) NOT NULL DEFAULT '0',
`values_checkpoint` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Table: Values
Create Table: CREATE TABLE `Values` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`total_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `total_id_id` (`total_id`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
スナップショットと値を組み合わせたクエリは次のようになります。
SELECT t.count + count(v.total_id),max(v.id)
FROM `Totals` t
JOIN `Values` v ON v.total_id = t.id AND v.id > t.values_checkpoint
WHERE t.id = 1;
問題がTotals
行を更新しています。
MySQLは更新の集合メソッドを許可しないため、これを直接更新に変換することはできません。
サブクエリへの結合は相関できないため、id > t.values_checkpoint
のWHERE句が必要です。私はこの作業を行う方法を見つけ出すことができる唯一の方法で開始することがREPEATABLE READ
にValues
に挿入をブロックすることができますので、t.count
とt.values_checkpoint
を設定
は別に動作しません、そして、彼らはREAD COMMITTED
に一貫性がないであろうトランザクションとSELECT ... FOR UPDATE
合計行は、Joinサブクエリで使用できるvalues_checkpointを取得します。これは理想的ではありません。なぜなら、トランザクションを開いた状態でロックをかけたままにする必要があるからです。
t.count
とt.values_checkpoint
の両方を1つの更新ステートメントとValues
の1つのSELECTで更新することはありますか?