唯一性太差的字段不宜建立索引的原因
时间: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='男'
这种不仅需要扫描这个索引 而且去取有‘男’的数据块基本覆盖了整个表所涉及的数据块
select * from tb where gender='男'
这种不仅需要扫描这个索引 而且去取有‘男’的数据块基本覆盖了整个表所涉及的数据块
所以说为重复性高的字段建索引最多是提高的效率不高。而不会像我上面说的那样反而降低查找速度?
那个解释的观点是我之前看的一本mysql优化的书上看到的,现在想想有很多点没弄明白
作者: imbigsnake1 发布时间: 2011-12-15
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28