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

标签 mysql stored-procedures select insert myisam

我们有一个大型 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/

相关文章:

c# - 使用 LINQ,选择另一个对象列表中的对象列表

mysql - 基于联接和自联接设置列值 MySql Rails

mysql - 插入...选择,在哪里

mysql - 存储过程与事务给我错误

mysql - 在一个查询中检查多个表

MySQL仅输出n行并将其余行分组为第n + 1行

mysql - 为什么自动增量不起作用?

sql - 在 Oracle 存储过程中搜索文本

php - 您如何处理 Mysql SP 无法使用默认参数的情况?

postgresql - postgresql 存储过程可以在单独的数据库上运行吗?