ElasticSearch(ES)的底层实现
- 倒排索引(Inverted Index):通过文档中的关键词查找文档ID列表,适用于全文检索。
- 正排索引(Forward Index):通过文档ID查找文档内容。
- 实现细节:
- Term Index:存储Term前缀,快速定位Term Dictionary。
- Term Dictionary:存储Term和指向Posting List的指针。
- Posting List:存储与Term相关的文档ID列表。
MySQL的底层实现
- InnoDB全文检索:支持全文检索,使用倒排索引。
- 辅助表:包含
word
和ilist
字段,word
字段上有索引,ilist
包含(Document ID, Position)。 - FTS Index Cache:红黑树结构的全文检索索引缓存,提高性能。
查询操作的实现
- ES:使用倒排索引 + 正排索引机制,适用于复杂查询和全文检索。
- MySQL:
- 使用B+ Tree索引或倒排索引查询记录ID。
- 可能需要二次回表操作,除非使用覆盖索引。
性能比较
- ES与MySQL的相似性:两者在查询实现上相似,都是通过索引查询记录ID,然后进行二次回表。
- ES的优势:在全文检索性能上优于MySQL InnoDB。
业务场景分析
- 复杂查询场景:面对千万量级数据和多个搜索条件,ES的“结果合并策略”(SkipList和Bitset)能更高效地处理多维复杂查询。
- MySQL的局限性:联合索引需要遵循最左前缀原则,限制了多维复杂查询的索引覆盖。
MySQL 8的新特性
- Skip Scan Range Access Method:在一定条件下可以不遵守最左前缀原则,利用范围扫描替代全表扫描。
结论
- ES的优势:在处理大规模数据和复杂查询时,ES的性能通常优于MySQL。
- 索引创建和查询优化:ES的索引创建和查询优化策略是其性能优势的关键。