H5W3
当前位置:H5W3 > 问答 > 正文

关于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行-符合预期。请问是什么原因?

请大神解惑

回答

mysql 的索引合并:

mysql 在 5.0版本开始引入了 “索引合并”策略,可以在一定程度上上使用表中的多个 单列索引 来进行数据的检索 。

正如上文中表中创建了 deleteTime和isFinish两个单例索引;但是在 select * from table where deleteTime=xxx and isFinish=xxx 这个语句执行中,任何一个单列索引都不是最好的选择,这时就可能会使用 索引合并。

需要注意的是:索引合并过程中需要耗费大量的CPU和内存等资源进行索引合并的计算,但是这个合并索引 是通过计算出来的,到底还是不如真实的联合索引,所以可能在过程中扫描的数据行比走联合索引扫描的数据行多,但是比走单列索引是扫描的数据行少。

注意:优化器并不会把索引合并的计算成本算在整个查询成本中,所以在执行计划中出现了 索引合并 时,需要记住此时 实际查询成本 要比 执行计划中的成本大很多;所以在执行计划中出现索引合并时 就需要进行优化了。

本文地址:H5W3 » 关于MySQL索引的index_merge

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址