【发布时间】:2021-12-21 19:28:28
【问题描述】:
尝试看看是否有任何方法可以提高 MySQL 中的 INSERT 速度。我在 Windows 10 上运行。这是我在循环中执行完全相同的 INSERT 10000 次后得到的结果:
MySQL:
CALL TestStoredProcedure(10000);
/* Affected rows: 0 Found rows: 1 Warnings: 0 Duration for 1 query: 48.906 sec. */
MSSQL:
EXEC TestStoredProcedure @iterations = 10000;
/* Affected rows: 10,000 Found rows: 0 Warnings: 0 Duration for 1 query: 0.875 sec. */
MySQL:
BEGIN
DECLARE counter INT DEFAULT 1;
WHILE counter <= iterations DO
INSERT INTO mytable (COLUMN1, COLUMN2) VALUES (counter, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
SET counter = counter + 1;
END WHILE;
END
MSSQL:
BEGIN
DECLARE @counter int
SET @counter = 1
WHILE (@counter <= @iterations)
BEGIN
INSERT INTO mytable (COLUMN1, COLUMN2) VALUES (@counter, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')
SET @counter = @counter + 1
END
END
谢谢大家!下面找到了解决方法,就是插入START TRANSACTION;这一行。
结果:
InnoDB (using START TRANSACTION;): 0.406 sec
InnoDB: 48.312 sec
MyISAM: 23.218 sec
MEMORY: 22.922 sec
BLACKHOLE: 22.890 sec
ARCHIVE: 22.860 sec
【问题讨论】:
-
众所周知,如果您一一进行,mysql 的插入速度会很慢。所以不要那样做。将它们批处理为每条语句 1000 行(整个语句长度必须小于 @@max_allowed_packet(默认为 16mb 左右))
-
另外,在存储过程中使用循环测量性能似乎不太可能与实际用例相匹配,其中插入将来自客户端
标签: mysql sql-server performance insert