MyISAM выбирает блокировку вставки только внутри процедуры - PullRequest
5 голосов
/ 01 декабря 2010

У нас есть большая таблица 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');

Эта вставка будет запускаться и возвращаться сразу же, однако, если я выполню следующий запрос:

CALL InsertProc('xyz1234');

Теперь запрос блокируется и ожидает завершения выбора.

MySql Версия: 5.0.51, работающая на Windows 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

Почему процедура открывается и "Блокировка таблицы" дважды?

Ответы [ 3 ]

1 голос
/ 10 декабря 2010

Эта проблема была представлена ​​как ошибка: http://bugs.mysql.com/bug.php?id=58689

1 голос
/ 03 декабря 2010

MyIASM по какой-то конкретной причине? Таблицы InnoDB обычно имеют гораздо лучшие характеристики блокировки.

0 голосов
/ 06 декабря 2010

Предположение: возможно, обработка блокировок / мьютексов в поле AUTO_INCREMENT в таблицах MyISAM строже при использовании хранимых процедур.

Чтобы исключить это, не могли бы вы установить тест, в котором ID былAUTO_INCREMENT

Вы дали INSERT DELAYED попытку, если ваше приложение может разрешить это?

...