Skip to content

Commit e314ff8

Browse files
committed
Update mysql-high-performance-optimization-specification-recommendations.md
1 parent 8af3147 commit e314ff8

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md

+33-23
Original file line numberDiff line numberDiff line change
@@ -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');
274262
insert 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

Comments
 (0)