Mysql
 sql >> база данни >  >> RDS >> Mysql

Застой на MySQL изтриване на редове

При изпълнение на 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;

В този случай MySQL избира RANGE път за достъп до id , което смята за по-евтино от REF на data .

При едновременна транзакция ще можете да изтривате или актуализирате редове 6 , 7 , 8 но не и редове 1 до 5 тъй като са заключени (въпреки факта, че само ред 2 е бил засегнат).

Ако премахнете id <= 5 от условието по-горе, ще можете да изтриете всеки ред освен ред 3 .

За съжаление не можете да контролирате MySQL пътища за достъп в DML операции.

Най-доброто, което можете да направите, е да индексирате правилно вашите условия и да се надявате, че MySQL ще избере тези индекси.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция MySQL CEILING() – закръгля до най-близкото цяло число

  2. Има ли MySQL еквивалент на TIMESTAMP на Oracle С ЧАСОВА ЗОНА?

  3. SpringDataJPA save OneToOne връзка получаване Не може да се добави или актуализира дъщерен ред:ограничение на външния ключ е неуспешно

  4. PHP/MySQL:Маркирайте резултатите от заявката SOUNDS LIKE

  5. MySQL - Тригер за актуализиране на същата таблица след вмъкване