77
88> 作者: 听风 原文地址: < https://www.cnblogs.com/huchong/p/10219318.html > 。
99>
10- > JavaGuide 已获得作者授权,并对原文内容进行了完善 。
10+ > JavaGuide 已获得作者授权,并对原文内容进行了完善补充 。
1111
1212## 数据库命名规范
1313
@@ -29,10 +29,7 @@ InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能
2929
3030兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储 emoji 表情的需要,字符集需要采用 utf8mb4 字符集。
3131
32- 参考文章:
33-
34- - [ MySQL 字符集不一致导致索引失效的一个真实案例] ( https://blog.csdn.net/horses/article/details/107243447 )
35- - [ MySQL 字符集详解] ( ../character-set.md )
32+ 推荐阅读一下我写的这篇文章:[ MySQL 字符集详解] ( ../character-set.md ) 。
3633
3734### 所有表和字段都需要添加注释
3835
@@ -135,18 +132,19 @@ MySQL 内存临时表不支持 TEXT、BLOB 这样的大数据类型,如果查
135132
136133相关阅读:[ 技术分享 | MySQL 默认值选型(是空,还是 NULL)] ( https://opensource.actionsky.com/20190710-mysql/ ) 。
137134
138- ### 使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间
139-
140- TIMESTAMP 存储的时间范围 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07
135+ ### 一定不要用字符串存储日期
141136
142- TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高
137+ 对于日期类型来说, 一定不要用字符串存储日期。可以考虑 DATETIME、TIMESTAMP 和 数值型时间戳。
143138
144- 超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储
139+ 这三种种方式都有各自的优势,根据实际场景选择最合适的才是王道。下面再对这三种方式做一个简单的对比,以供大家实际开发中选择正确的存放时间的数据类型:
145140
146- ** 经常会有人用字符串存储日期型的数据(不正确的做法)**
141+ | 类型 | 存储空间 | 日期格式 | 日期范围 | 是否带时区信息 |
142+ | ------------ | -------- | ------------------------------ | ------------------------------------------------------------ | -------------- |
143+ | DATETIME | 5~ 8字节 | YYYY-MM-DD hh:mm: ss [ .fraction] | 1000-01-01 00:00:00[ .000000] ~ 9999-12-31 23:59:59[ .999999] | 否 |
144+ | TIMESTAMP | 4~ 7字节 | YYYY-MM-DD hh:mm: ss [ .fraction] | 1970-01-01 00:00:01[ .000000] ~ 2038-01-19 03:14:07[ .999999] | 是 |
145+ | 数值型时间戳 | 4字节 | 全数字如1578707612 | 1970-01-01 00:00:01之后的时间 | 否 |
147146
148- - 缺点 1:无法用日期函数进行计算和比较
149- - 缺点 2:用字符串存储日期要占用更多的空间
147+ MySQL 时间类型选择的详细介绍请看这篇:[ MySQL时间类型数据存储建议] ( https://javaguide.cn/database/mysql/some-thoughts-on-database-storage-time.html ) 。
150148
151149### 同财务相关的金额类数据必须使用 decimal 类型
152150
@@ -230,9 +228,13 @@ InnoDB 是按照主键索引的顺序来组织表的
230228
231229## 数据库 SQL 开发规范
232230
231+ ### 尽量不在数据库做运算,复杂运算需移到业务应用里完成
232+
233+ 尽量不在数据库做运算,复杂运算需移到业务应用里完成。这样可以避免数据库的负担过重,影响数据库的性能和稳定性。数据库的主要作用是存储和管理数据,而不是处理数据。
234+
233235### 优化对性能影响较大的 SQL 语句
234236
235- 要找到最需要优化的 SQL 语句。要么是使用最频繁的语句,要么是优化后提高最明显的语句,可以通过查询 MySQL 的慢查询日志来发现需要进行优化的 SQL 语句;
237+ 要找到最需要优化的 SQL 语句。要么是使用最频繁的语句,要么是优化后提高最明显的语句,可以通过查询 MySQL 的慢查询日志来发现需要进行优化的 SQL 语句。
236238
237239### 充分利用表上已经存在的索引
238240
@@ -244,9 +246,10 @@ InnoDB 是按照主键索引的顺序来组织表的
244246
245247### 禁止使用 SELECT \* 必须使用 SELECT <字段列表> 查询
246248
247- - ` SELECT * ` 消耗更多的 CPU 和 IO 以网络带宽资源
248- - ` SELECT * ` 无法使用覆盖索引
249- - ` SELECT <字段列表> ` 可减少表结构变更带来的影响
249+ - ` SELECT * ` 会消耗更多的 CPU。
250+ - ` SELECT * ` 无用字段增加网络带宽资源消耗,增加数据传输时间,尤其是大字段(如 varchar、blob、text)。
251+ - ` SELECT * ` 无法使用 MySQL 优化器覆盖索引的优化(基于 MySQL 优化器的“覆盖索引”策略又是速度极快,效率极高,业界极为推荐的查询优化方式)
252+ - ` SELECT <字段列表> ` 可减少表结构变更带来的影响、
250253
251254### 禁止使用不含字段列表的 INSERT 语句
252255
@@ -378,4 +381,9 @@ pt-online-schema-change 它会首先建立一个与原表结构相同的新表
378381- 程序使用数据库账号只能在一个 DB 下使用,不准跨库
379382- 程序使用的账号原则上不准有 drop 权限
380383
384+ ## 推荐阅读
385+
386+ - [ 技术同学必会的MySQL设计规约,都是惨痛的教训 - 阿里开发者] ( https://mp.weixin.qq.com/s/XC8e5iuQtfsrEOERffEZ-Q )
387+ - [ 聊聊数据库建表的15个小技巧] ( https://mp.weixin.qq.com/s/NM-aHaW6TXrnO6la6Jfl5A )
388+
381389<!-- @include: @article-footer.snippet.md -->
0 commit comments