MySQL 对比 MSSQL INSERTs 速度测试
MySQL vs MSSQL INSERTs speed test
正在尝试查看是否有任何方法可以提高 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
对于初学者,尽可能避免循环
例如,您的 LOOP 需要 0.839
秒,而固定方法需要 0.027
秒
INSERT INTO MyTable (COLUMN1, COLUMN2)
Select Top 10000
Column1 = row_number() over (order by (select NULL))
,Column2 = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
From master..spt_values n1, master..spt_values n2
编辑...纯属娱乐dbFiddle
您好,您可能正在使用 InnoDB 作为数据库引擎,InnoDB 的工作原理是它需要在每次插入后进行提交,这会使您的插入变慢,请按如下方式重写您的函数:
BEGIN
DECLARE counter INT DEFAULT 1;
Start transaction;
WHILE counter <= iterations DO
INSERT into MyTable (Column1, Column2) VALUES (counter, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
SET counter = counter + 1;
END WHILE;
commit;
END;
正在尝试查看是否有任何方法可以提高 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
对于初学者,尽可能避免循环
例如,您的 LOOP 需要 0.839
秒,而固定方法需要 0.027
秒
INSERT INTO MyTable (COLUMN1, COLUMN2)
Select Top 10000
Column1 = row_number() over (order by (select NULL))
,Column2 = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
From master..spt_values n1, master..spt_values n2
编辑...纯属娱乐dbFiddle
您好,您可能正在使用 InnoDB 作为数据库引擎,InnoDB 的工作原理是它需要在每次插入后进行提交,这会使您的插入变慢,请按如下方式重写您的函数:
BEGIN
DECLARE counter INT DEFAULT 1;
Start transaction;
WHILE counter <= iterations DO
INSERT into MyTable (Column1, Column2) VALUES (counter, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
SET counter = counter + 1;
END WHILE;
commit;
END;