MyISAM Selects locks inserts inside procedure only
We have a large MyISAM table to which rows get inserted to the bottom of the table only.
While doing some benchmarks, i realized that selects do not (always) lock other inserts to that same table. However, when the inserts are coming from a stored procedure/function they will by locked by the select.
Why is that?
To demonstrate this behavior:
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 ;
Run the following query:
SELECT Count(*) FROM Foo WHERE INSTR(Bar, 'abcdefg') > 0;
While that Select is running, open a new connection and run the following insert query:
INSERT Foo(Bar) VALUES ('xyz1234');
That Insert will run and return right away, However if i run the following query:
CALL InsertProc('xyz1234');
Now the query locks and waits for the select to complete.
MySql Version: 5.0.51 running on Window Server 2K3
Thank you.
-- UPDATE Here is the profile output:
Insert Direct:
(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
Insert via Procedure:
(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
Why does the p开发者_JAVA百科rocedure open and "Table lock" twice?
This issue was submitted as a bug: http://bugs.mysql.com/bug.php?id=58689
MyIASM for any particular reason? InnoDB tables usually have much better locking characteristics.
Speculation: perhaps the locking/mutex handling on the AUTO_INCREMENT
field on MyISAM tables is stricter when stored procedures are used.
To rule it out, could you set up a test where ID
wasn't an AUTO_INCREMENT
field?
Have you given INSERT DELAYED a try if you application might allow for it?
精彩评论