关于MySQL索引的index_merge
关于MySQL的index_merge和复合索引有什么本质的区别,原理是什么?我有一个表有deleteTime和isFinish两个索引;
- 当创建两个单独的索引的时候我用explain看到使用索引类型是index_merge,extra是intersect方式,rows是1360行;
- 假如单独使用where deleteTime或者where isFinish这两个索引的话,rows分别是2600行左右;
- 如果创建了(deleteTime,isFinish)这个复合索引的话结果的row是130行-符合预期。请问是什么原因?
请大神解惑
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
mysql 的索引合并:
mysql 在 5.0版本开始引入了 “索引合并”策略,可以在一定程度上上使用表中的多个 单列索引 来进行数据的检索 。
正如上文中表中创建了 deleteTime和isFinish两个单例索引;但是在 select * from table where deleteTime=xxx and isFinish=xxx 这个语句执行中,任何一个单列索引都不是最好的选择,这时就可能会使用 索引合并。
需要注意的是:索引合并过程中需要耗费大量的CPU和内存等资源进行索引合并的计算,但是这个合并索引 是通过计算出来的,到底还是不如真实的联合索引,所以可能在过程中扫描的数据行比走联合索引扫描的数据行多,但是比走单列索引是扫描的数据行少。
注意:优化器并不会把索引合并的计算成本算在整个查询成本中,所以在执行计划中出现了 索引合并 时,需要记住此时 实际查询成本 要比 执行计划中的成本大很多;所以在执行计划中出现索引合并时 就需要进行优化了。