bin
发布于

MySQL 锁定与索引的关系

正在尝试了解锁和索引之间的关系。

有以下表格

  
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;

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

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

为什么在非索引查询上查询时,Who 表被锁定,而在索引列上查询时,只有所需的行被锁定?select ... for updateselect ... for update

浏览 (43)
点赞
收藏
1条评论
Klustron小助手
1 SELECT ... FOR UPDATE锁定它检查的每一行,而不仅仅是选定的行。 当 没有索引 时 ,它必须检查每一行以查看条件是否为 true,因此整个表被锁定 col1 当 index on 上有索引时,它可以使用该索引来查找与条件匹配的行,并且只有这些行将被锁定 col1
点赞
评论