Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bế tắc trên MySQL xóa hàng

Khi thực hiện DML hoạt động, InnoDB khóa tất cả các hàng đã quét, không khớp.

Hãy xem xét bố cục bảng này:

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;

Trong trường hợp này, MySQL chọn RANGE đường dẫn truy cập trên id , mà nó cho là rẻ hơn REF trên dữ liệu data .

Trong một giao dịch đồng thời, bạn sẽ có thể xóa hoặc cập nhật các hàng 6 , 7 , 8 nhưng không phải hàng 1 thành 5 vì chúng đã bị khóa (mặc dù thực tế là chỉ có hàng 2 bị ảnh hưởng).

Nếu bạn xóa id <= 5 từ điều kiện trên, bạn sẽ có thể xóa bất kỳ hàng nào trừ hàng 3 .

Rất tiếc, bạn không thể kiểm soát MySQL đường dẫn truy cập trong DML hoạt động.

Tốt nhất bạn có thể làm là lập chỉ mục các điều kiện của mình đúng cách và hy vọng rằng MySQL sẽ chọn các chỉ mục này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi MYSQL:1045 (28000):Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost'

  2. Tạo bảng với PHP và điền từ MySQL

  3. Cấu hình chỉ mục Mysql

  4. Làm cách nào tôi có thể chọn * từ một bảng trong MySQL nhưng bỏ qua các cột nhất định?

  5. MySQL truy vấn chậm với tham gia mặc dù EXPLAIN cho thấy kế hoạch tốt