前言:
记录一下处理数据时遇到的问题,希望能促进学习与被指正
问题:
300多个子表,共千万数据,汇总到一个汇总表中,后续如果查询需要索引提速,怎么建?
索引建立的时机:
方式1.建表时就建立好索引,考虑:插入千万条数据后,如果再增加索引,耗时有点久
方式2.建表时不建立索引,插完数据后,再增加索引,不考虑加索引的耗时
目前看到的现象:
同一段执行脚本
在方式1下:
插入耗时非常之久
在方式2下:
可能不排除有其他因素干扰,但是是在同一台电脑同一段脚本执行下,差距明显
原因分析:(AI分析)
从索引的工作机制来看,索引就像数据的 “目录”,能加快后续查询速度,但维护这个 “目录” 需要额外成本。
豆包AI分析:
在方式 1 中,建表时就建立索引,意味着每插入一条数据,数据库不仅要把数据本身存入表中,还要同步更新索引结构。以常见的 B - 树索引为例,每插入一条数据,可能需要对 B - 树的节点进行分裂、平衡等操作,来保证索引的有序性和查询效率。对于千万级别的数据量,这种频繁的索引更新操作会产生大量的 IO(输入 / 输出)交互和计算开销。每一条数据的插入都伴随着索引的动态调整,积少成多,最终导致整体插入耗时非常久。
而方式 2 中,建表时不建立索引,插入数据的过程就变得简单直接。此时数据库只需专注于将数据逐条写入表中,无需考虑索引的维护,避免了插入过程中频繁的索引结构调整。虽然在数据全部插入后建立索引也需要一定时间,但这种一次性的索引构建是基于已有的完整数据集进行的,操作效率更高。它可以通过批量处理等方式构建索引,减少了像方式 1 中那种逐条插入时的频繁交互开销,因此整体来看,插入数据阶段的耗时会明显缩短。
综上,两种方式的核心差异在于索引维护的时机,方式 1 将索引维护分散在每一次数据插入过程中,而方式 2 将索引维护集中在数据插入完成后,这就导致了插入耗时的显著差距。
后续:
现在只描述一个现象和测试,希望后面更加深入了解索引与数据库的相关机制,欢迎指正