mysql如何创建高效索引_高效的MySQL索引建立方法及原理

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

2e673110f7e4bba96a72492748c93edb.png

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

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

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

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

16a7cd836239437920f3c25116c21219.png

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

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

8d8b9cfd30bb44d7ee64dcb0469795ec.png

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开启索引。所以建立联合索引,一定要用最左原则,对最常用的字段,放在最左边。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值