MySQL 开发规范
SQL数据库开发
共 1988字,需浏览 4分钟
· 2022-06-27
作者:在云端 juejin.im/post/5c15c2b3f265da6170070613
所有的数据库对象名称必须使用小写字母并用下划线分割(MySQL大小写敏感,名称要见名知意,最好不超过32字符) 禁止在数据中存储图片,文件二进制数据(使用文件服务器)
禁止在线上做数据库压力测试
禁止从开发环境,测试环境直接连生产环境数据库
限制每张表上的索引数量,建议单表索引不超过5个(索引会增加查询效率,但是会降低插入和更新的速度) 避免使用ENUM数据类型(修改ENUM值需要使用ALTER语句,ENUM类型的ORDER BY操作效率低,需要额外操作,禁止使用书值作为ENUM的枚举值
尽量把所有的字段定义为NOT NULL(索引NULL需要额外的空间来保存,所以需要暂用更多的内存,进行比较和计算要对NULL值做特别的处理)
使用timestamp或datetime类型来存储时间
同财务相关的金额数据,采用decimal类型(不丢失精度,禁止使用 float 和 double) 所有的数据库对象名称禁止使用MySQL保留关键字
临时库表必须以tmp为前缀并以日期为后缀(tmp_)
备份库和库必须以bak为前缀并以日期为后缀(bak_)
所有存储相同数据的列名和列类型必须一致。
数据库和表的字符集尽量统一使用utf8(字符集必须统一,避免由于字符集转换产生的乱码,汉字utf8下占3个字节)
所有表和字段都要添加注释COMMENT,从一开始就进行数据字典的维护
建议使用物理分表的方式管理大数据
尽量做到冷热数据分离,减小表的宽度(mysql限制最多存储4096列,行数没有限制,但是每一行的字节总数不能超过65535。列限制好处:减少磁盘io,保证热数据的内存缓存命中率,避免读入无用的冷数据)
禁止在表中建立预留字段(无法确认存储的数据类型,对预留字段类型进行修改,会对表进行锁定) 避免使用双%号和like,搜索严禁左模糊或者全模糊(如果需要请用搜索引擎来解决。索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索)
建议使用预编译语句进行数据库操作
禁止跨库查询(为数据迁移和分库分表留出余地,降低耦合度,降低风险)
禁止select * 查询(消耗更多的cpu和io及网络带宽资源,无法使用覆盖索引)
in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内
禁止使用order by rand()进行随机排序 避免建立冗余索引和重复索引(冗余:index(a,b,c) index(a,b) index(a))
禁止给表中的每一列都建立单独的索引
区分度最高的列放在联合索引的最左侧
尽量把字段长度小的列放在联合索引的最左侧
尽量避免使用外键(禁止使用物理外键,建议使用逻辑外键)
尽量使用 union all 代替 union
拆分复杂的大SQL为多个小SQL( MySQL一个SQL只能使用一个CPU进行计算)
对于程序连接数据库账号,遵循权限最小原则
超过三个表禁止 join。(需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。即使双表 join 也要注意表索引、SQL 性能。)
在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts最好
使用 ISNULL()来判断是否为 NULL 值。
尽量不要使用物理删除(即直接删除,如果要删除的话提前做好备份),而是使用逻辑删除,使用字段delete_flag做逻辑删除,类型为tinyint,0表示未删除,1表示已删除
如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合,索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。
最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。
有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行
数据前线 ——End——
后台回复关键字:1024,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群。
推荐阅读
评论
大厂都在用的 Git 代码管理规范 !
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
2
为什么我们公司还在用 Python 开发项目?
作者:哇哒嘻哇https://www.zhihu.com/question/278798145/answer/3416549119最近几年里,经常看到某些曾重度使用 Python 的大公司迁移成其它语言技术栈,但是,那些小公司/小团队的情况如何呢?一直很想了解那些仍在坚持使用 Python,且支撑业
机器学习算法与Python实战
0
面试官:MySQL 上亿大表,如何深度优化?
来源:cnblogs.com/YangJiaXin/p/10828244.html背景分析测试实施索引优化后delete大表优化为小批量删除总结前段时间刚入职一家公司,就遇上这事!背景XX实例(一主一从)xxx告警中每天凌晨在报SLA报警,该报警的意思是存在一定的主从延迟(若在此时发生主从切换,需要
好好学java
0
MySQL 巨坑:永远不要在 MySQL 中使用 UTF-8!!
来源:网络👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目
小哈学Java
10
嵌入式开发的尽头是什么?
知乎问题,摘选了一个回答大家也可以评论说自己的看法首先转管理岗当然是可以的。。这个几乎是废话,啥行业做到最后,都可以选择当部门经理。。如果是技术岗位。。那就是全栈工程师。。其实,嵌入式软件开发最大的缺点就是,接触不到供应链。。没法单干。。我给你讲一个故事。。我在2020年的时候,在一家嵌入式开发公司
嵌入式Linux
10
嵌入式开发的一个骚操作!
关注、星标公众号,直达精彩内容来源 | 网络目录1 映射表在串口数据解析中的应用1.1 数据结构1.2 指令、函数映射表1.3 串口解析函数实现2 映射表在UI设计中的应用2.1 数据结构2.2 函数映射表2.3 定义两个变量保存当前场景和上一个场景2.4 按下Up按键
李肖遥
0
Nat Biotechnol | 叶凯团队开发基因组新生和体细胞结构变异分析算法—SVision-pro
基因组结构变异与丰富多彩的生物性状进化和严重疾病表型密切相关。多种遗传病和癌症的变异研究需要在多个样本之间进行基因组变异差异比较,进而获得真正与疾病进展相关的新生(de novo)和体细胞(Somatic)结构变异。目前,领域内常用的“先检测再求差”的分步式策略要求在基因组检测后有多个计算步骤,繁杂
生信宝典
0
鸿蒙开发岗突增!它和前端开发到底有哪些区别和联系?
2024年1 月 18 日,鸿蒙 Next 预览版面向开发者正式开放申请。至此,鸿蒙原生应用版图已成型,这个中国自主研发的操作系统,正式走上了独立之路。有许多的公司都陆续地加入了鸿蒙原生应用开发的队列,从年初宣布的200+个应用加入鸿蒙生态,到如今的4000+个应用加入鸿蒙,短短2个月时间激增了20
前端大学
0