首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

这些高效的MySQL索引建立方法及原理,你知道吗?

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

对不同的存储引擎,有着不同的索引,例如对于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开启索引。所以建立联合索引,一定要用最左原则,对最常用的字段,放在最左边。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200512A00NVX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券