唯一性太差的字段不宜建立索引的原因
因为mysql首先会将索引中的键值取出来与内存中存储表数据的页中的数据相比较,但是数据页中的数据的顺序和索引队列中键值的顺序并不是一致的。假如索引中的键值a先在数据页x中找到了符合的数据,然后又在数据页y中找到了符合条件的数据,这时mysql便会把数据页x销毁掉,把数据页Y读到内存中。如果这时候还有键值b,然后键值b找的数据又在数据页x上,则mysql又要把数据页x读到内存中。也就是说从索引去寻找对应的表数据的时候是随机访问的。(实际情况应该是内存中缓存了好几页的数据,应该不只一页,但是这里假定线程内存中只存在一张页表)。这样的随机访问所造成的io消耗是比全表扫描的io消耗来得大的。(还不如遍历整张表)
假如索引字段唯一性好的话,比如是唯一的,则最多只需要换一次页表。
假如索引字段唯一性差的话,需要进行的换页次数也就相应的提高了。
以上是我以前根据书上的内容作的总结。但是最近又想想其实完全可以在找到索引后直接定位到记录的物理位置然后取出来。
所以真相到底是怎么样的呢,求赐教。