mysql组合索引建立顺序及key_len计算规则

mysql多个字段建立组合索引时候,字段顺序可以随意,但最好是遵循一定顺序的,如索引(a,b,c)与(b,a,c)肯定不一样的,顺序不一样索引的效果也不一样,所以要计算其先后顺序。

如表mc_k12_wechat_user_info有如下字段

 

1、计算组合索引建立的顺序
1、常用的字段放在最前面
现在要建立组合索引(phone_number,provice),phone_number肯定是经常差的,要放在前边,provice不经常查,放在后边

2、等值条件尽量在前边
等值条件尽量在前边,在扫描的时候,找到的索引块都是有效数据。若非等值条件放在前边,那么需要进行索引跳跃扫描,或者范围扫描,这是就扫描了很多无效的索引,非等值条件放在后边可以,减少无效的索引扫描,提高查找效率。

3、离散值较高的字段往前放
现在要建立组合索引(phone_number,union_id,open_id)

SELECT 
COUNT(DISTINCT phone_number)/COUNT(*) phone_number, 
COUNT(DISTINCT union_id)/COUNT(*) union_id ,
COUNT(DISTINCT open_id)/COUNT(*) open_id 
from mc_k12_wechat_user_info

结果如下,按照ji计算值由大到小的顺序建立组合索引,值越大表明该字段不为空索引命中的几率越大。

由计算结果可以看到 open_id > phone_number > union_id,组合索引建立的顺序就是(open_id,phone_number,union_id)

ALTER TABLE mc_k12_wechat_user_info INDEX idx_wechat_user_info (open_id,phone_number,union_id)
2、EXPLAIN 之key_len计算规则
各种数据类型计算规则如下:

 

char和varchar类型key_len计算公式:

varchr(N)变长字段且允许NULL = N * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)

varchr(N)变长字段且不允许NULL = N * ( character set:utf8=3,gbk=2,latin1=1)+2(变长字段)

char(N)固定字段且允许NULL = N * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)

char(N)固定字段且允许NULL = N * ( character set:utf8=3,gbk=2,latin1=1)

数值数据的key_len计算公式:

TINYINT允许NULL = 1 + 1(NULL)

TINYINT不允许NULL = 1

SMALLINT允许为NULL = 2+1(NULL)

SMALLINT不允许为NULL = 2

INT允许为NULL = 4+1(NULL)

INT不允许为NULL = 4

日期时间型的key_len计算:(针对mysql5.5及之前版本)

DATETIME允许为NULL = 8 + 1(NULL)

DATETIME不允许为NULL = 8

TIMESTAMP允许为NULL = 4 + 1(NULL)

TIMESTAMP不允许为NULL = 4

3、举例说明索引idx_union_id的计算规则
 EXPLAIN 查看执行计划

EXPLAIN SELECT * from mc_k12_wechat_user_info where union_id = 'oNC5b6PvqwyLCpbc8b1aPMLNrtgk'
看到key_len=194


 查看表结构

desc mc_k12_wechat_user_info
可以看到union_id的字段类型为varchar,长度为64且不允许为空,表字符编码为utf8

所以key_len= varchar(64) * utf8(3) + 2 = 64 * 3 + 2 = 194

组合索引遵循索引最左原则,组合索引的key_len计算亦遵循此原则,以最左边的索引字段长度为计算准则
————————————————
版权声明:本文为CSDN博主「LiryZlian」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lzxlfly/article/details/100129240

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值