首页 >> 基础教程
千万数据先insert和先建索引哪个快
在千万级数据量场景下,先插入数据再创建索引(Insert → Create Index)通常比先创建索引再插入数据(Create Index → Insert)更快。原因如下:
索引维护成本差异:
先建索引再插入:每次插入单条数据时,数据库需实时维护索引结构(B+树分裂/合并、页分裂等)。插入 N 条数据需执行 N 次索引维护操作,产生大量随机 I/O。
先插数据再建索引:插入数据时无索引维护开销,后续通过批量构建索引一次性生成索引结构。数据库会优化该过程(如排序后顺序写入),减少随机 I/O
性能对比(以 MySQL InnoDB 为例):
操作方式 耗时主要来源 千万级数据预估耗时 先建索引 → 插入数据 每次插入触发索引维护 数小时甚至更久 先插入数据 → 建索引 单次批量索引构建 分钟级到几十分钟 其他优势:
减少 Write-Ahead Log (WAL) 压力:实时维护索引会产生更多日志。
利用高效算法:
CREATE INDEX会使用更优的排序构建算法(如 MySQL 的 Bulk Load)。避免页面分裂:批量构建索引时数据已有序,减少 B+ 树结构调整次数
操作流程
-- 1. 创建空表(无索引) CREATE TABLE my_table (...); -- 2. 导入数据 (LOAD DATA 或 INSERT)LOAD DATA INFILE 'data.csv' INTO TABLE my_table; -- 3. 数据导入完成后创建索引 CREATE INDEX idx_name ON my_table(column);
实测:
# 测试环境:MySQL 8.0, 10M 行数据 # 方式1: 先建索引后插入 CREATE INDEX idx ON large_table(col); INSERT INTO large_table ... -- 耗时: 32 min # 方式2: 先插入后建索引 INSERT INTO large_table ... -- 耗时: 3 min CREATE INDEX idx ON large_table(col); -- 耗时: 5 min 总耗时: 8 min (快 75%)
注意事项:
持续写入的实时表:若不能停服,只能先建索引。
唯一约束依赖索引:如需在插入时通过唯一索引去重,必须先建索引。
内存充足+SSD 环境:硬件能缓解随机 I/O 压力,但数据量越大优势越不明显。
最新文章
10.5 反规范化:什么时候需要打破规则?2026-03-22
10.4 第三范式(3NF)2026-03-22
10.3 第二范式(2NF)2026-03-22
10.2 第一范式(1NF)2026-03-22
10.1 什么是数据库规范化?2026-03-22
9.5 实践:电商系统表关系设计2026-03-22
9.4 实际案例:博客系统表设计2026-03-22
9.3 多对多关系2026-03-22
9.2 一对多关系2026-03-22
9.1 一对一关系2026-03-18

发表评论
所有评论