mysql 锁定与索引的关系

问题描述 投票:0回答:1

我试图理解锁和索引之间的关系。

我有下表

CREATE TABLE example_table (
    id INT AUTO_INCREMENT,
    col1 VARCHAR(255),
    col2 INT,
    PRIMARY KEY (id)
);
INSERT INTO example_table (col1, col2) VALUES ('a',1); 
INSERT INTO example_table (col1, col2) VALUES ('b',2); 
INSERT INTO example_table (col1, col2) VALUES ('c',3); 
INSERT INTO example_table (col1, col2) VALUES ('d',4); 

当我在 2 个单独的事务上运行以下查询时,我得到

SELECT * FROM example_table where col1="a" FOR UPDATE;

SELECT * FROM example_table where col1="b" FOR UPDATE;

当运行第二个查询时,它会等待第一个查询释放独占锁。

但是如果我向 col1 添加索引,则运行这 2 个 slecet 查询不会等待彼此的锁定。

我的问题是:为什么在非

indexed
上查询 select ... for update 时,谁表被锁定,而在
indexed
列上查询 select ... for update 时,仅锁定所需的行?

mysql innodb
1个回答
0
投票

SELECT ... FOR UPDATE
锁定它检查的每一行,而不仅仅是选定的行。

col1
上没有索引时,它必须检查每一行以查看条件是否为真,因此整个表被锁定。

col1
上有索引时,它可以使用该索引来查找符合条件的行,并且只有这些行才会被锁定。

© www.soinside.com 2019 - 2024. All rights reserved.