问答

关于MySQL索引的index_merge

作者:admin 2021-05-06 我要评论

关于MySQL的index_merge和复合索引有什么本质的区别,原理是什么?我有一个表有deleteTime和isFinish两个索引; 当创建两个单独的索引的时候我用explain看到使用...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

关于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和内存等资源进行索引合并的计算,但是这个合并索引 是通过计算出来的,到底还是不如真实的联合索引,所以可能在过程中扫描的数据行比走联合索引扫描的数据行多,但是比走单列索引是扫描的数据行少。

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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 关于MySQL索引的index_merge

    关于MySQL索引的index_merge

  • 求助!!导航栏需要完成不规则图片拼接

    求助!!导航栏需要完成不规则图片拼接

  • 正则 输入的不能全部是特殊符号

    正则 输入的不能全部是特殊符号

  • vue.use报错Cannot read property 'use

    vue.use报错Cannot read property 'use

腾讯云代理商
海外云服务器