MySQL vs MSSQL INSERTs 速度测试

Posted

技术标签:

【中文标题】MySQL vs MSSQL INSERTs 速度测试【英文标题】:MySQL vs MSSQL INSERTs speed test 【发布时间】: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

【问题讨论】:

看看8.2.5.1 Optimizing INSERT Statements是否有帮助。 众所周知,如果您一一进行,mysql 的插入速度会很慢。所以不要那样做。将它们批处理为每条语句 1000 行(整个语句长度必须小于 @@max_allowed_pa​​cket(默认为 16mb 左右)) 另外,在存储过程中使用循环测量性能似乎不太可能与实际用例相匹配,其中插入将来自客户端 【参考方案1】:

您好,您可能正在使用 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;

【讨论】:

谢谢萨什科!他们让它工作得更快的关键指令是 START TRANSACTION;.【参考方案2】:

对于初学者来说,尽可能避免循环

例如,您 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

【讨论】:

好的,谢谢。即使使用循环,我也能用 MSSQL 获得极好的速度。我遇到问题的地方是 MySQL。 @MightyMouse 够公平的。由于性能问题,我已经很多年没有接触过 MySQL。

以上是关于MySQL vs MSSQL INSERTs 速度测试的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Workbench EER Diagram Table Editing 中的 Inserts 选项卡有啥作用?

MSSQL里面建索引的问题

mssql数据库占用CPU过高?

clickhouseToo many parts . Merges are processing significantly slower than inserts

mssql数据库在磁盘阵列运行慢

在mysql vs cassandra中插入速度