Saat melakukan DML
operasi, InnoDB
mengunci semua baris yang dipindai, tidak cocok.
Pertimbangkan tata letak tabel ini:
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;
Dalam hal ini, MySQL
memilih RANGE
jalur akses di id
, yang dianggap lebih murah daripada REF
pada data
.
Dalam transaksi bersamaan, Anda akan dapat menghapus atau memperbarui baris 6
, 7
, 8
tapi bukan baris 1
ke 5
karena terkunci (meskipun faktanya hanya baris 2
terpengaruh).
Jika Anda menghapus id <= 5
dari kondisi di atas, Anda dapat menghapus baris apa pun kecuali baris 3
.
Sayangnya, Anda tidak dapat mengontrol MySQL
jalur akses di DML
operasi.
Yang terbaik yang dapat Anda lakukan adalah mengindeks kondisi Anda dengan benar dan berharap MySQL
akan memilih indeks ini.