关于MySQL索引的index_merge

发布于 2022-09-12 22:13:47 字数 316 浏览 33 评论 0

关于MySQL的index_merge和复合索引有什么本质的区别,原理是什么?我有一个表有deleteTime和isFinish两个索引;

  • 当创建两个单独的索引的时候我用explain看到使用索引类型是index_merge,extra是intersect方式,rows是1360行;
  • 假如单独使用where deleteTime或者where isFinish这两个索引的话,rows分别是2600行左右;
  • 如果创建了(deleteTime,isFinish)这个复合索引的话结果的row是130行-符合预期。请问是什么原因?

请大神解惑

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半世晨晓 2022-09-19 22:13:47

mysql 的索引合并:

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文