【问题标题】:Inserting 1 Million records is taking too much time MYSQL插入 100 万条记录花费太多时间 MYSQL
【发布时间】:2015-11-20 06:30:50
【问题描述】:

我有一个简单的三列表格测试

id -> primary key (auto increment)
name -> varchar
age -> int

我正在使用一个简单的存储过程在表中填充 100 万条数据。

drop PROCEDURE if  EXISTS big_data;
CREATE PROCEDURE big_data()
BEGIN
    DECLARE i int DEFAULT 1;
    WHILE i <= 10000000 DO
        INSERT INTO test(id, name, age) VALUES (i, 'name', 34);
        SET i = i + 1;
    END WHILE;
END;

CALL big_data(); 

我面临的问题是使用这个简单的模式插入 100 万条记录需要将近 6 到 7 个小时。我想知道如何快速插入数据? 我不想使用LOAD DATA INFILE 查询,我没有更改 my.ini 文件中的任何设置。

只是想知道插入太慢的原因?

系统规格

    Mysql version 5.5.25a
    innodb_version =1.1.8
    System = 16GB RAM / 8 cores @ 2.70 GHz

【问题讨论】:

  • 考虑到这是一种非常低效的插入数据方式,您的数据库实际上每秒插入几百行。没那么糟糕。考虑到机器上的大多数内核对这种串行插入(它是单线程的)都没有好处......简而言之,它很慢,因为你使用了错误的数据库。
  • 我没有明白您使用了错误的 DB @AssafLavie 并建议我使用有效的方式插入数据?
  • 不是错误的数据库,而是错误的使用数据库。执行批量插入或加载数据。这就是它的用途。
  • 如果 id 是自增的,为什么还要插入呢?

标签: mysql performance bulkinsert


【解决方案1】:

尝试将您的查询设为单个字符串,然后立即执行

drop PROCEDURE if  EXISTS big_data;
CREATE PROCEDURE big_data()
BEGIN
    DECLARE total_count TEXT DEFAULT '';
    DECLARE i int DEFAULT 1;
    WHILE i <= 10000000 DO
        SET total_count = total_count + '(' + i+ ', name, 34),';
        SET i = i + 1;
    END WHILE;
    SET total_count = TRIM(TRAILING ',' FROM total_count);
    INSERT INTO test(id, name, age) VALUES ' + total_count;
END;

【讨论】:

  • 这目前被否决为-1,我想知道为什么。为什么这是一个坏主意有什么特别的原因吗?我和问题提交者有类似的问题,正在考虑尝试这样的事情。
  • @MarkVerrey 无法追踪谁对它投了反对票,但如果它对你有帮助,你可以随时给它 +1。
【解决方案2】:

一次插入 100 行的速度是 100 1-row INSERTs 的 10 倍:

插入到 foo (a, b, c) 价值观 (1,2,3), (4,5,6), ...;

LOAD DATA 可能更快。

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多