物流商 网站建设方案,装修设计网站排行,公众号怎么做链接,深圳企业企业网站建设欢迎点开这篇文章#xff0c;自我介绍一下哈#xff0c;本人姑苏老陈 #xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章#xff0c;定期更新#xff0c;欢迎关注自我介绍一下哈本人姑苏老陈 是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章定期更新欢迎关注谢谢 :- 文章目录 一、前言二、索引设计规范三、总结 一、前言
在我们对数据库技术方案设计的时候我们是否有自己的设计理念或者原则还是更多的依据自己的直觉去设计是否曾经懊悔线上发生过的一次低级故障可能稍微注意点就可以避免是否想过怎么才能很好的避免规范的价值正是我们工作的检查清单需要我们不断从错误中积累有效经验来指导未来的工作。
本文介绍MySQL数据库开发设计规范之索引设计规范。 PS以下规范在大型互联网公司经过了充分的验证尤其适用于并发量大、数据量大的业务场景。 二、索引设计规范
1.【推荐】单表索引建议控制在5个以内 说明索引可以增加查询效率但同样也会降低插入和更新的效率甚至有些情况下会降低查询效率所以不是越多越好
2.【强制】禁止在更新十分频繁区分度不高的属性上建立索引 说明比如订单状态字段不适合建立索引
3.【强制】建立组合索引必须把区分度高的字段放在前面 说明比如添加组合索引
ALTER TABLE payment ADD INDEX idx_customer_id_staff_id(customer_id, staff_id)其中customer_id的区分度更高所以放在前面
4.【推荐】对字符串使用索引如果字符串定义长度超过128的可以考虑前缀索引。
说明例如普通的字符串索引alter table user add index idx_user_email(email); 前缀字符串索引alter table user add index idx_user_email(email(6))建议使用前缀索引5.【强制】表必须有主键并且是auto_increment及not null的根据表的实际情况定义无符号的tinyint,smallint,int,bigint
说明比如order_id类型定义为int(11) unsigned6.【强制】禁止更新频繁的列作为主键
7.【强制】禁止字符串列作为主键
8.【强制】禁止UUID、MD5、HASH这些作为主键这样数值太离散了
9.【推荐】默认使用非空的唯一键作为主键
10.【推荐】主键建议设置为自增长
11.【推荐】核心SQL优先考虑覆盖索引
12.【强制】不在索引列进行数学运算和函数运算
13.【推荐】研发要经常使用explain如果发现索引选择性差必须要学会使用hint。 说明type值至少要达到 range 级别其中type即找到所需数据使用的扫描方式效率从好到坏依次为System(系统表)const(常量连接)eq_ref(唯一性索引扫描)ref(非唯一索引扫描)range(范围扫描)index(索引树扫描all(全表扫描)
14.【推荐】能使用唯一索引就要使用唯一索引提高查询效率
15.【推荐】多条字段重复的语句要修改语句条件字段的顺序为其建立一条联合索引减少索引数量
16.【强制】索引字段要保证不为NULL考虑default value进去。NULL也是占空间而且NULL非常影响索引的查询效率
17.【强制】新建的唯一索引不能和主键重复
18.【推荐】尽量不使用外键、外键用来保护参照完整性可在业务端实现 说明避免对父表和子表的操作会相互影响降低可用性影响数据库性能
19.【强制】表必须有无符号int型自增主键对应表中id字段 说明使用自增主键当数据写入时可以提高插入性能避免page分裂减少表碎片
20.【推荐】WHERE条件中的非等值条件IN、BETWEEN、、、、会导致后面的条件使用不了索引
21.【推荐】索引字段的顺序需要考虑字段值去重之后的个数个数多的放在前面 说明换言之记录字段值重复多的放在后面
22.【推荐】ORDER BYGROUP BYDISTINCT的字段需要添加在索引的后面
23.【参考】合理创建联合索引避免冗余如(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)
24.【推荐】复合索引中的字段数建议不超过5个
25.【强制】不在选择性低的列上建立索引例如性别、“状态”、“类型”
26.【推荐】对于单独条件如果走不了索引可以使用force-index强制指定索引 说明例如假设我们有一个名为users的表它有一个名为lastname的列并且我们对这个列建立了一个索引。如果我们想强制查询使用这个索引。
SELECT * FROM users FORCE INDEX (idx_user_lastname) WHERE lastname Smith;27.【强制】禁止给表中的每一列都建立单独的索引;
28.【推荐】在varchar字段上建立索引时必须指定索引长度没必要对全字段建立索引根据实际文本区分度决定索引长度即可 说明比如给email字段指定索引长度。
alter table user add index idx_user_email(email(6))三、总结
以上介绍了在进行MySQL数据库表索引设计时可以遵循的一些技术规范。希望对大家有帮助谢谢 :-
附本文参考资料
阿里云官方知乎https://www.zhihu.com/org/a-li-yun-97-77阿里云开发者官方社区https://developer.aliyun.com/阿里开发者官方CSDN社区https://blog.csdn.net/alitech2017?typeblog阿里云云栖号CSDNhttps://blog.csdn.net/yunqiinsight/category_10231626.html阿里巴巴技术团队发布的《JAVA开发手册》泰山版阿里云开发者官方微信公众号 如果您对文章中内容有疑问欢迎在评论区进行留言我会尽量抽时间给您回复。如果文章对您有帮助欢迎点赞、收藏。您的点赞是对我最大的支持和鼓励谢谢 :-