首页 >> 基础教程

千万数据先insert和先建索引哪个快

在千万级数据量场景下,先插入数据再创建索引(Insert → Create Index)通常比先创建索引再插入数据(Create Index → Insert)更快。原因如下:

  1. 索引维护成本差异

    1. 先建索引再插入:每次插入单条数据时,数据库需实时维护索引结构(B+树分裂/合并、页分裂等)。插入 N 条数据需执行 N 次索引维护操作,产生大量随机 I/O。

    2. 先插数据再建索引:插入数据时无索引维护开销,后续通过批量构建索引一次性生成索引结构。数据库会优化该过程(如排序后顺序写入),减少随机 I/O

  2. 性能对比(以 MySQL InnoDB 为例)

    1. 操作方式耗时主要来源千万级数据预估耗时
      先建索引 → 插入数据每次插入触发索引维护数小时甚至更久
      先插入数据 → 建索引单次批量索引构建分钟级到几十分钟
  3. 其他优势

    1. 减少 Write-Ahead Log (WAL) 压力:实时维护索引会产生更多日志。

    2. 利用高效算法CREATE INDEX 会使用更优的排序构建算法(如 MySQL 的 Bulk Load)。

    3. 避免页面分裂:批量构建索引时数据已有序,减少 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%)


注意事项:

  1. 持续写入的实时表:若不能停服,只能先建索引。

  2. 唯一约束依赖索引:如需在插入时通过唯一索引去重,必须先建索引。

  3. 内存充足+SSD 环境:硬件能缓解随机 I/O 压力,但数据量越大优势越不明显。


所有评论

最新文章
13.6 EXPLAIN语句:查看查询执行计划2026-04-08
13.5 索引使用原则:什么时候建索引?2026-04-08
13.4 查看和删除索引2026-04-08
13.3 索引类型:B树、哈希、全文索引2026-04-08
13.2 创建索引:CREATE INDEX2026-04-08
13.1 什么是索引?为什么需要它?2026-04-08
12.5 联合查询:UNION和UNION ALL2026-04-07
12.4 相关子查询2026-04-07
12.3 FROM子句中的子查询2026-04-06
12.2 WHERE子句中的子查询2026-04-05
关于我 备案号:蜀ICP备2023042032号-1