Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zakleszczenia w MySQL usuwających wiersze

Podczas wykonywania DML operacje, InnoDB blokuje wszystkie zeskanowane wiersze, które nie są dopasowane.

Rozważ następujący układ tabeli:

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;

W tym przypadku MySQL wybiera RANGE ścieżka dostępu na id , które uważa za tańsze niż REF na data .

W równoczesnej transakcji będziesz mógł usunąć lub zaktualizować wiersze 6 , 7 , 8 ale nie wiersze 1 do 5 ponieważ są zablokowane (pomimo faktu, że tylko wiersz 2 został naruszony).

Jeśli usuniesz id <= 5 z powyższego warunku będziesz mógł usunąć dowolny wiersz oprócz wiersza 3 .

Niestety nie możesz kontrolować MySQL ścieżki dostępu w DML operacje.

Najlepsze, co możesz zrobić, to właściwie zaindeksować warunki i mieć nadzieję, że MySQL wybierze te indeksy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC zawsze testuje ostatni wiersz tabeli MySQL?

  2. Mam PHP wypełniające pole rozwijane i chcę, aby wypełniło również dwa pola tekstowe tylko do odczytu z tej samej tabeli

  3. jQuery UI - przyspieszenie autouzupełniania

  4. Mysql Nie można było nawiązać połączenia, ponieważ maszyna docelowa aktywnie je odrzuciła

  5. Łączenie jednego stołu z wieloma stołami