gpt4 book ai didi

mysql - MyISAM Selects 锁仅在过程内部插入

转载 作者:可可西里 更新时间:2023-11-01 07:08:31 26 4
gpt4 key购买 nike

我们有一个大型 MyISAM 表,其中的行仅插入到表的底部。

在做一些基准测试时,我意识到选择不会(总是)将其他插入锁定到同一个表。但是,当插入来自存储过程/函数时,它们将被选择锁定。

这是为什么?

演示此行为:

CREATE TABLE Foo (
ID INT NOT NULL AUTO_INCREMENT,
Bar VARCHAR(200),
PRIMARY KEY(ID)) ENGINE=MyISAM;

--INSERT into Foo 10M rows


DELIMITER $$

DROP PROCEDURE IF EXISTS InsertProc$$

CREATE PROCEDURE InsertProc(IN vBar VARCHAR(255))
BEGIN
INSERT Foo(Bar) VALUES (vBar);
END$$

DELIMITER ;

运行以下查询:

SELECT Count(*) FROM Foo WHERE INSTR(Bar, 'abcdefg') > 0;

当 Select 正在运行时,打开一个新连接并运行以下插入查询:

INSERT Foo(Bar) VALUES ('xyz1234');

Insert 将立即运行并返回,但是如果我运行以下查询:

CALL InsertProc('xyz1234');

现在查询锁定并等待选择完成。

MySql 版本:5.0.51 运行于 Window Server 2K3

谢谢。

-- 更新这是配置文件输出:

直接插入:

(initialization)     0.0000432
checking permissions 0.0000074
Opening tables 0.0000077
System lock 0.0000032
Table lock 0.0000025
init 0.000021
update 0.0002365
end 0.0000382
query end 0.000002
freeing items 0.0000057
closing tables 0.0000022
logging slow query 0.0000005

通过过程插入:

(initialization) 0.0000285
Opening tables 0.0004325
System lock 0.0000022
Table lock 0.0002957
checking permissions 0.0000047
Opening tables 0.000004
System lock 0.0000017
Table lock 3.2365122
init 0.0000422
update 0.000251
end 0.0000025
query end 0.000003
closing tables 0.00004
query end 0.0000074
freeing items 0.0000074
logging slow query 0.000001
cleaning up 0.5790915

为什么程序打开并“表锁定”两次?

最佳答案

此问题已作为错误提交: http://bugs.mysql.com/bug.php?id=58689

关于mysql - MyISAM Selects 锁仅在过程内部插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4321029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com