+ -
当前位置:首页 → 问答吧 → 唯一性太差的字段不宜建立索引的原因

唯一性太差的字段不宜建立索引的原因

时间:2011-12-15

来源:互联网

因为mysql首先会将索引中的键值取出来与内存中存储表数据的页中的数据相比较,但是数据页中的数据的顺序和索引队列中键值的顺序并不是一致的。假如索引中的键值a先在数据页x中找到了符合的数据,然后又在数据页y中找到了符合条件的数据,这时mysql便会把数据页x销毁掉,把数据页Y读到内存中。如果这时候还有键值b,然后键值b找的数据又在数据页x上,则mysql又要把数据页x读到内存中。也就是说从索引去寻找对应的表数据的时候是随机访问的。(实际情况应该是内存中缓存了好几页的数据,应该不只一页,但是这里假定线程内存中只存在一张页表)。这样的随机访问所造成的io消耗是比全表扫描的io消耗来得大的。(还不如遍历整张表)
假如索引字段唯一性好的话,比如是唯一的,则最多只需要换一次页表。
假如索引字段唯一性差的话,需要进行的换页次数也就相应的提高了。


以上是我以前根据书上的内容作的总结。但是最近又想想其实完全可以在找到索引后直接定位到记录的物理位置然后取出来。
所以真相到底是怎么样的呢,求赐教。

作者: imbigsnake1   发布时间: 2011-12-15

如果觉得我上半部分不知道在说什么的可以直接略过,给出自己的观点就好

作者: imbigsnake1   发布时间: 2011-12-15

select * from tb where gender='男'

这种不仅需要扫描这个索引 而且去取有‘男’的数据块基本覆盖了整个表所涉及的数据块

作者: rucypli   发布时间: 2011-12-15

引用 2 楼 rucypli 的回复:

select * from tb where gender='男'

这种不仅需要扫描这个索引 而且去取有‘男’的数据块基本覆盖了整个表所涉及的数据块

所以说为重复性高的字段建索引最多是提高的效率不高。而不会像我上面说的那样反而降低查找速度?
那个解释的观点是我之前看的一本mysql优化的书上看到的,现在想想有很多点没弄明白

作者: imbigsnake1   发布时间: 2011-12-15