请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于二次查找我有点疑问,想确认一下

https://img1.sycdn.imooc.com//szimg/5d7a521209396b5500000000.jpg

  1. 既然innodb辅助索引,要查找二次,那么我是不是认为myisam引擎查询速度要比innodb要快。至少在利用辅助索引来进行查找上面。 

  2. 如果我的第一点想法没问题的话,那么innob为什么要这么来做,辅助索引的叶子节点为什么不直接存放物理数据的地址。这样不是更快吗?是什么样的原因让它必须这么来二次查找。

正在回答 回答被采纳积分+3

1回答

翔仔 2019-09-13 00:23:07

同学好,

1.对于innodb的覆盖索引,就不需要回表数据去查,覆盖索引可以参考 https://www.cnblogs.com/happyflyingpig/p/7662881.html,

其他情况下可能会比myisam稍慢。

2.

如果每个二级索引也都存储数据,那么数据得冗余好多份,得不偿失。

0 回复 有任何疑惑可以回复我~
  • 老师,你这里说的冗余多份,是指B+树的叶子节点都是储存的数据,而不是指向数据的指针吗
    回复 有任何疑惑可以回复我~ 2020-03-07 23:26:36
  • 翔仔 回复 过客12 #2
    同学好,我看了一下,当时同学问说为什么不在辅助索引里面也存储数据的地址,其实数据的地址通常情况下会比主键索引占用的字节大没,地址一般由 文件号+块号+块内偏移组成,大概10个字节。
    同时,当对一个innodb表进行大量DML后,B+树会分裂,同一行记录的页地址会发生变化。
    由于辅助索引记录的是主键值,因此完全不用理会这个变化,如果辅助索引记录的是实际页地址,那DML一旦引起B+树分裂,还得与辅助索引进行同步。
    回复 有任何疑惑可以回复我~ 2020-03-09 02:06:46
  • 过客12 回复 翔仔 #3
    谢谢老师,其实我对这个几种索引(尤其是覆盖索引)还有一些疑惑,老师有推荐的书籍或者博客吗。
      还有一个问题,看到你后面讲的(在别人提的问题中)针对于innodb行级锁是对主键索引进行锁住的而非对数据进行加锁,那么针对于非聚集索引优化成覆盖索引减少回表操作时,是怎么进行行级锁的呢?或者这种情况下根本不能进行这样的优化?
      我还在其他看到今年2月份老师回答别人问题说到互联网寒冬的情况是怎么样的呢:)
    回复 有任何疑惑可以回复我~ 2020-03-09 02:21:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信