更新时间:2018-08-09 来源:黑马程序员 浏览量:
任何事物都有它的两面性,索引也不例外,索引的好处很多,但这里咱们聊聊索引的坏处。
索引的缺点是很明显的,因为索引本身是有序的,而跟新数据的过程中也要更新索引,更新完后还要保持索引的有序性,这就需要付出很大的开销了,索引不好的一面就从这里开始显示出来了。
我们先简要综述一下索引的不足之处有哪些,接下来详细阐述,随后一起和大家探索各种工作中的案例,最后为思考回顾。
索引的不足之处
关于索引的不足之处我们可以从索引的开销和容易失败这两方面来讨论:
1.1索引的各种开销
1.1.1热块竞争
索引最新的数据块一般是在最右边,而我们访问数据时正常来说也是访问比较新的数据,历史数据很少有人关注,然后问题就来了,大家都一起访问最新的数据,不是都集中于同一个目标来访问了吗?这就很容易产生热块竞争。
1.1.2回表开销
另外大家都知道索引存储索引列的值和rowid,通过rowid来定位回到表中,其实这个回到表中的开销也是很大,具体情况我们随后可以了解到。
1.1.3更新开销
索引的有序性是一个非常重要的特性,这个特性能够消除排序等开销,但是索引块要保持有序性,可不是一件容易的事,毕竟索引列的数据是随机插入的,比如你在原来的索引列中存储的是100,110,111,等等时,现在要插入101,就应该在100和111之间插入,为了保证这个顺序索引需要做很多事,比如索引块分裂。而索引列的增删改的开销是很大的。
1.1.4建立开销
还有千万别忽略了建立索引的开销,这也和索引的有序性有关。我们在建立索引的过程中,首先把索引列的数据排序提取出来,再插入到块中形成索引块,这时如果数据不断地插入,排序提取这个动作什么时候能结束呢?所以还必须要锁表,这就是一个很大的开销(online建索引是一个特殊的思路,这里不做描述)。当然建索引过程中排序这个动作本身也是不小的开销。
1.2索引使用失效
索引的不足之处除了上述的几点外,从另一个维度看,还会有失效的可能。我们现在知道建索引对查询一般比较有利,对更新一般比较有害。不过有的时候,虽然建了索引,但其对查询毫无帮助,这种情况还是有的。比如索引失效了,这分为逻辑失效和物理失效两种。
1.2.1逻辑失效
逻辑失效是索引本身并没有真正失效,只是由于写法的问题导致索引用不上,比如对SQL的条件列进行运算,类似select * from t where upper(name)=’ABC’等,这时在name列上建了Btree索引是用不上的,再或者比如被人强制用了全表扫描的Hint等导致数据库被迫不用索引,等等。
1.2.2物理失效
物理失效就是索引真的失效了,比如被人误设了unusable动作,或者是一些类似分区表的不规范操作导致的索引失效。
总结:上述简要地介绍了索引的一些不足之处,后面的篇章再详细讨论一番.....后期待续
作者:黑马程序员javaEE培训学院
首发:http://java.itheima.cn/