高效数据库中插入百万数据(耗时几秒)

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

在建立表的时候不建立索引,插入百万数据效率高一些

适用于MySQL8亲测

-- =============================================
-- 1. 创建测试表(若已存在则先删除)
-- =============================================
DROP TABLE IF EXISTS test_index_1;
CREATE TABLE test_index_1 (
    id INT AUTO_INCREMENT COMMENT '主键',
    a INT NOT NULL COMMENT '联合索引第一个字段',
    b INT NOT NULL COMMENT '联合索引第二个字段',
    c INT NOT NULL COMMENT '联合索引第三个字段',
    d INT NOT NULL COMMENT '',
    PRIMARY KEY (id),
    INDEX idx_a_b_c (a, b, c) COMMENT '联合索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'test_index_1表';

-- =============================================
-- 2. 创建批量插入百万数据的存储过程(完整无省略)
-- =============================================
DROP PROCEDURE IF EXISTS insert_test_index_1;
DELIMITER //  -- 临时修改语句结束符为//,避免存储过程内的;提前终止

CREATE PROCEDURE insert_test_index_1()
BEGIN
    -- 定义变量:循环计数器、批量插入行数、总目标行数
    DECLARE i INT DEFAULT 1;
    DECLARE batch_size INT DEFAULT 1000;  -- 每次批量插入1000行,平衡效率与内存
    DECLARE total_rows INT DEFAULT 1000000;  -- 总插入100万行
    
    -- ========== 核心优化:关闭自动提交,减少事务开销 ==========
    SET autocommit = 0;
    -- 临时禁用索引更新(插入后重建,大幅提升速度)
    ALTER TABLE test_index_1 DISABLE KEYS;

    -- ========== 循环批量插入数据 ==========
    WHILE i <= total_rows DO
        INSERT INTO test_index_1 (a, b, c, d)
        SELECT 
            -- a字段:基础值(i+num)*1000 + 随机数,保证高区分度
            (i + t.num) * 1000 + FLOOR(RAND() * 1000),
            -- b字段:基础值(i+num)*100 + 随机数,保证高区分度
            (i + t.num) * 100 + FLOOR(RAND() * 100),
            -- c字段:基础值(i+num) + 随机数,保证高区分度
            (i + t.num) + FLOOR(RAND() * 10000),
            -- d字段:纯随机数,扩大取值范围
            FLOOR(RAND() * 100000000)
        FROM (
            -- 递归CTE生成0~999的数字序列(MySQL 8.0+支持),用于批量生成1000行数据
            WITH RECURSIVE nums AS (
                SELECT 0 AS num  -- 初始值
                UNION ALL
                SELECT num + 1 FROM nums WHERE num < 999  -- 递归生成到999
            )
            SELECT num FROM nums
        ) AS t
        WHERE (i + t.num) <= total_rows;  -- 避免最后一批超出百万行

        -- 每批量插入1000行提交一次,避免事务过大
        COMMIT;
        -- 计数器递增
        SET i = i + batch_size;
    END WHILE;

    -- ========== 恢复配置 ==========
    ALTER TABLE test_index_1 ENABLE KEYS;  -- 重建索引
    SET autocommit = 1;  -- 恢复自动提交

    -- 输出完成提示(MySQL命令行可见)
    SELECT '百万数据插入完成!' AS result;
END //

DELIMITER ;  -- 恢复语句结束符为;

-- =============================================
-- 3. 执行存储过程(开始插入百万数据)
-- =============================================
CALL insert_test_index_1();

-- =============================================
-- 4. 验证插入结果(可选)
-- =============================================
-- 统计总数据量
SELECT COUNT(*) AS total_rows FROM test_index_1;
-- 验证a字段区分度(无重复则返回空)
SELECT a, COUNT(*) AS repeat_count FROM test_index_1 GROUP BY a HAVING repeat_count > 1 LIMIT 10;
-- 查看字段取值范围(确认区分度)
SELECT 
    MIN(a) AS min_a, MAX(a) AS max_a,
    MIN(b) AS min_b, MAX(b) AS max_b,
    MIN(c) AS min_c, MAX(c) AS max_c
FROM test_index_1;

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

全部评论
很有效果的经验帖子了 码住
点赞 回复 分享
发布于 03-11 20:32 四川
mark
点赞 回复 分享
发布于 03-10 17:17 广东

相关推荐

03-13 00:04
已编辑
吉林大学 Java
约面的挺突然。。狠下心接了1.自我介绍2.讲讲JAVA的反射3.可以继续讲讲AOP,动态代理[&nbsp;因为讲反射不小心吟唱到了例如AOP的动态代理,但是这块记忆的非常不熟,结果磕磕绊绊&nbsp;]4.项目我看你写了AOP和注解,具体怎么实现滑动窗口限流的[&nbsp;梦到什么说什么,吟唱八股发散千万不要散到自己不熟悉的区域&nbsp;]5.也讲讲为什么另一个项目选择令牌桶,具体流程6.&nbsp;OK,讲讲&nbsp;Redis&nbsp;的数据类型?还有吗?就了解这五种嘛[&nbsp;把5个的基础类型从应用对比到历届底层全都吟唱了一遍。一句还有吗直接没力气了,简历就写了理解5种,别的我是真一点没看TT&nbsp;]7.讲讲Redission分布式锁实现8.这个指数退避怎么实现的9.在这里有考虑去保障幂等性嘛10.这里为什么使用指数退避呢?&nbsp;什么时候用均匀重传[已经晕过去了说不了解,刚说了后就意识到,估计应该说指数退避能缓解压力防止下游服务器雪崩之类的]11.ok,那讲讲JMM12.讲讲RocketMQ如何保证的不丢消息13.讲讲RocketMQ延迟消息原理14.讲讲项目Redis实现会话记忆这一块15.如果ai调用function&nbsp;calling出现幻觉,有考虑怎么解决吗?[&nbsp;不了解,面试官说什么接口幂等化,高危操作人工防护,没在听,感觉人已经飞升了TT&nbsp;]16.mcp了解嘛?和function&nbsp;calling有什么区别[&nbsp;依旧不了解,只能说了个前者规范架构抽象解耦,后者耦合高只能算个工具调用]17.AI生成代码的代码质量怎么保障,那平时如何review的呢18.算法。lc215&nbsp;&nbsp;数组中最大第k个元素19.打算考研还是本科就业20.反问1️⃣有哪里不足,有哪些需要提高的部分。[主要说知识广度不够,多刷算法,让我别太紧张]2️⃣部门业务会做什么人生第二次面试。感觉大厂面试官的气场压力很大应该凉了不过这次面试非常锻炼心态,多面试,多面试。
Luxlord:面经太硬核了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务