暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql中的冗余索引和重复索引

suger 2022-07-15
559

Mysql中的冗余索引和重复索引
(1)重复索引:
指的是在对应列上,以相同的顺序不同的索引名称建⽴了多套⼀模⼀样的联合索引(单值索引也有,不过相对来说没那么奇葩做这种事),
例如:
ALTER TABLE a ADD INDEX ‘idx_1’ (‘id’,’name’,’sex’)
ALTER TABLE a ADD INDEX ‘idx_2’ (‘id’,’name’,’sex’)
ALTER TABLE a ADD INDEX ‘idx_3’ (‘id’,’name’,’sex’)
这三个就是重复索引,占⽤三倍的索引磁盘存储空间,降低了SQL查询优化器判断选择的性能。⾮常不可取 -------------------------------------------------------- 作者:苍太风明初露010 链接:https://wenku.baidu.com/view/cc2a6d5aa16925c52cc58bd63186bceb19e8edec.html 来源:百度文库 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(2)冗余索引:
指的是不同的联合索引组合,某⼀列或者⼏列字段被多组索引覆盖,⼀般称这些列存在冗余索引,例如:
ALTER TABLE a ADD INDEX ‘idx_1’ (‘id’,’name’,’sex’)
ALTER TABLE a ADD INDEX ‘idx_2’ (‘id’,’name’,’phone’)
ALTER TABLE a ADD INDEX ‘idx_3’ (‘id’,’name’,’address’)
ALTER TABLE a ADD INDEX ‘idx_4’ (‘id’,’name’)
这种创建⽅式,套在id,name两个列上的索引会有4个,我们知道索引的前置匹配规则,id,name套了四层,树结构也会冗余四层,这是⾮
常浪费空间的,同时在查询的时候,由于id和name有四种索引可以选择,SQL优化器的性能也会受影响,这种⽅式虽然很多时间没办法避
免,但是可以尽量优化。
1:为什么⽆法避免?
业务SQL就是需要id,name,address⼀种查询条件组合,id,name,phone⼜⼀种查询组合,⽽address和phone唯⼀性⽐较⾼,不加联合索
引会导致⼤量的扫表和回表查询,拖慢查询性能。
2:如何优化?
像sex这种要么男要么⼥的列,就不要增加⼀个联合索引了,因为它的区分度不⾼,假设有100万⼈,五⼗万⼥⼈,那么sex通过辅助索引
查50万id再做回表主键索引查,这样该扫的⾏还是很多,加了索引基本没什么⽤,复⽤id,name的组合⽅式就可以。
像已经有那么多id,name,XXX的组合了,单独id,name这个顺序组合的索引就可以不要了,让优化器⾃动匹配其它的联合索引,它们根据
左匹配,肯定会顺着查id,name的。
(3)索引命名规范
每家公司应该都有不同要求吧,⼀般都是idx_XX_XX,这⾥的XX也可以按照公司规定,例如:
按照列组合命名:Idx_id_name_sex
按照功能命名:ldx_check_user_info
按照列和功能组合命名:ldx_id_name_sex_checklist
但是需要注意,索引名称长度限制64,单个表最⼤索引数16,超过的话就创建失败。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论