@@ -66,7 +66,11 @@ InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能
6666
6767在数据库中存储文件会严重影响数据库性能,消耗过多存储空间。
6868
69- 文件(比如图片)这类大的二进制数据通常存储于文件服务器,数据库只存储文件地址信息
69+ 文件(比如图片)这类大的二进制数据通常存储于文件服务器,数据库只存储文件地址信息。
70+
71+ ### 不要被数据库范式所束缚
72+
73+ 一般来说,设计关系数据库时需要满足第三范式,但为了满足第三范式,我们可能会拆分出多张表。而在进行查询时需要对多张表进行关联查询,有时为了提高查询效率,会降低范式的要求,在表中保存一定的冗余信息,也叫做反范式。但要注意反范式一定要适度。
7074
7175### 禁止在线上做数据库压力测试
7276
@@ -153,6 +157,10 @@ decimal 类型为精准浮点数,在计算时不会丢失精度。占用空间
153157
154158不过, 由于 decimal 需要额外的空间和计算开销,应该尽量只在需要对数据进行精确计算时才使用 decimal 。
155159
160+ ### 单表不要包含过多字段
161+
162+ 如果一个表包含过多字段的话,可以考虑将其分解成多个表,必要时增加中间表进行关联。
163+
156164## 索引设计规范
157165
158166### 限制每张表上的索引数量,建议单张表索引不超过 5 个
@@ -222,23 +230,9 @@ InnoDB 是按照主键索引的顺序来组织表的
222230
223231## 数据库 SQL 开发规范
224232
225- ### 建议使用预编译语句进行数据库操作
226-
227- 预编译语句可以重复使用这些计划,减少 SQL 编译所需要的时间,还可以解决动态 SQL 所带来的 SQL 注入的问题。
233+ ### 优化对性能影响较大的 SQL 语句
228234
229- 只传参数,比传递 SQL 语句更高效。
230-
231- 相同语句可以一次解析,多次使用,提高处理效率。
232-
233- ### 避免数据类型的隐式转换
234-
235- 隐式转换会导致索引失效如:
236-
237- ``` sql
238- select name,phone from customer where id = ' 111' ;
239- ```
240-
241- 详细解读可以看:[ MySQL 中的隐式转换造成的索引失效] ( ./index-invalidation-caused-by-implicit-conversion.md ) 这篇文章。
235+ 要找到最需要优化的 SQL 语句。要么是使用最频繁的语句,要么是优化后提高最明显的语句,可以通过查询 MySQL 的慢查询日志来发现需要进行优化的 SQL 语句;
242236
243237### 充分利用表上已经存在的索引
244238
@@ -248,12 +242,6 @@ select name,phone from customer where id = '111';
248242
249243在定义联合索引时,如果 a 列要用到范围查找的话,就要把 a 列放到联合索引的右侧,使用 left join 或 not exists 来优化 not in 操作,因为 not in 也通常会使用索引失效。
250244
251- ### 程序连接不同的数据库使用不同的账号,禁止跨库查询
252-
253- - 为数据库迁移和分库分表留出余地
254- - 降低业务耦合度
255- - 避免权限过大而产生的安全风险
256-
257245### 禁止使用 SELECT \* 必须使用 SELECT <字段列表> 查询
258246
259247- ` SELECT * ` 消耗更多的 CPU 和 IO 以网络带宽资源
@@ -274,6 +262,22 @@ insert into t values ('a','b','c');
274262insert into t(c1,c2,c3) values (' a' ,' b' ,' c' );
275263```
276264
265+ ### 建议使用预编译语句进行数据库操作
266+
267+ - 预编译语句可以重复使用这些计划,减少 SQL 编译所需要的时间,还可以解决动态 SQL 所带来的 SQL 注入的问题。
268+ - 只传参数,比传递 SQL 语句更高效。
269+ - 相同语句可以一次解析,多次使用,提高处理效率。
270+
271+ ### 避免数据类型的隐式转换
272+
273+ 隐式转换会导致索引失效如:
274+
275+ ``` sql
276+ select name,phone from customer where id = ' 111' ;
277+ ```
278+
279+ 详细解读可以看:[ MySQL 中的隐式转换造成的索引失效] ( ./index-invalidation-caused-by-implicit-conversion.md ) 这篇文章。
280+
277281### 避免使用子查询,可以把子查询优化为 join 操作
278282
279283通常子查询在 in 子句中,且子查询中为简单 SQL(不包含 union、group by、order by、limit 从句) 时,才可以把子查询转化为关联查询进行优化。
@@ -331,6 +335,12 @@ where create_time >= '20190101' and create_time < '20190102'
331335- MySQL 中,一个 SQL 只能使用一个 CPU 进行计算
332336- SQL 拆分后可以通过并行执行来提高处理效率
333337
338+ ### 程序连接不同的数据库使用不同的账号,禁止跨库查询
339+
340+ - 为数据库迁移和分库分表留出余地
341+ - 降低业务耦合度
342+ - 避免权限过大而产生的安全风险
343+
334344## 数据库操作行为规范
335345
336346### 超 100 万行的批量写 (UPDATE,DELETE,INSERT) 操作,要分批多次进行操作
0 commit comments