www.adminn.cn
站长正能量分享网!

高效的MySQL索引建立方法及原理

AD:阿里云服务器企业会员更优惠 腾讯云香港,韩国免备案服务器1.8折优惠

索引是一种可以快速找到记录的数据结构,是由存储引擎来决定的。

对不同的存储引擎,有着不同的索引,例如对于InnoDB用b+树做索引,b+树是一种多路平衡树,它不同于b-树,数据分布在所有的叶子节点上,非叶子片由于不保存数据只保存索引项,所以一个非叶子片可以放更多节点。在搜索过程中,一个非叶子片的节点越多,意味着树高度越低,从而减少了读IO的操作实现了高效搜索。叶子片用链表顺序连接在一起,便于做范围搜索和前缀匹配搜索,全局搜索,而且查询时间稳定因为数据都在叶子节点上。而b-树适合随机搜索,因为非叶子片上就可以结束搜索。

对于Memory存储引擎,使用的是hash索引。hash索引的特点是速度很快,但是由于是根据hash值来搜索数据,导致hash索引无法应对范围搜索和前缀匹配的情况。这也是为什么Memory表适合做缓存表的原因,三个字,查询快!!!

下面,我来介绍几个高效的索引建立方式并讨论:

当有字符串匹配需求的时候,不要对字符串建立索引,而是用mysql的CRC32/MD5等hash函数将字符串映射为一个数值类型。并将其扩展为一个数值型字段,对这个数值型字段建立索引,如图

这样做的好处就是, 在进行索引时,存在一个比较的过程。数值型比较要远比字符串比较高效的多(因为字符串比较是逐个字符对比),其次数值型的索引文件要远比字符串型的索引文件要节省内存。但是缺点就是,该字段不再支持前缀匹配和范围搜索了,因为hash值是无规律的。

对于超长字符串TEXT,超长varchar等。如果我们想建立高效索引,也并非不可能。我们只需对前n个字符建立索引即可,无须对整个字符串建立索引。如下

ALTER TABLE img ADD INDEX(RIGHT(img_url,10)) 我们只需要右边10个字符建立的索引,就足以区分所有的字符串了。是不是非常的高效!!??

联合索引,当我们有and参与的where条件查询,或者group by 和order by,我们就可以考虑建立这种联合索引了。假设我们建立索引项(A,B,C),MySQL会快速定位到符合A项的数据集中,再在此数据集中快速定位符合B项的子数据集。但是值得一提的就是,若查询条件未按索引项顺序来例如 select id from user where B=”b” and C=”c” ,就会触发全表扫描。因为索引时,无法跳过A项就对B,C开启索引。所以建立联合索引,一定要用最左原则,对最常用的字段,放在最左边。

模板优惠价: (点击购买)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《高效的MySQL索引建立方法及原理》
文章链接:https://www.adminn.cn/news/2033.html
本站资源模板仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。2021.5月起,网站调整,暂不再分享免费模板。谢谢理解

Adminn.Cn 站长分享圈

帝国CMS精品模板腾讯云优惠券,代金券

本站源码仅供本地环境下学习借鉴研究使用!

源码请勿用于任何涉灰站点!净化网络,站长更有责!

支付宝扫一扫打赏