GSI创建速度为何如此缓慢?性能疑问及原理咨询
问题解答
一、耗时差异是否正常?
完全正常。空bucket和已有大量文档的bucket创建索引的工作量根本不在一个量级,这个耗时差符合预期。
二、索引创建的内部原理
1. 空bucket创建索引的流程
这时候本质上只是做元数据初始化:
- 生成索引的核心配置(比如哪些字段要索引、用什么分词规则),在系统里注册这个新索引的信息
- 全程几乎不用处理实际数据,只是在内存里构建数据结构、往磁盘写入少量配置文件
- 10-12秒的耗时基本是系统初始化索引元数据、同步配置的固定开销,和数据量无关
2. 已有70000份文档的bucket创建索引的流程
当bucket里有数据时,创建索引要多做一个全量数据转索引的核心步骤:
- 先把bucket里的70000份文档全部遍历一遍,逐个读取内容
- 对每个文档里要索引的字段做处理:如果是文本字段就拆分关键词(分词),字段类型不符合的做转换,生成能被搜索引擎快速识别的索引项
- 把这些索引项整理成倒排结构(简单说就是把每个关键词和包含它的文档对应起来,方便后续搜索时快速定位)
- 整个过程要频繁读磁盘取文档,还要用CPU处理分词和索引项生成,内存还要缓存中间数据,最后还要把建好的索引写到磁盘里
- 这些额外的IO、CPU计算开销,直接让耗时涨到了18-20秒,这个时长和文档数量、单文档大小、机器的IO性能直接相关
3. 影响耗时的关键因素
- 文档总数:文档越多,要处理的数据量自然越大
- 单文档大小:文档内容越多,读取和处理的时间就越长
- 索引字段数量:需要建索引的字段越多,每个文档的处理逻辑就越复杂
- 硬件性能:磁盘读写速度(SSD肯定比机械盘快)、CPU核心数(分词这类操作吃CPU)、内存大小(内存够大可以缓存更多中间数据,减少磁盘来回读的次数)
内容的提问来源于stack exchange,提问作者Abhilash Gopal
相关产品推荐
相关产品推荐

