Python-100-Days/Day91-100/93.MySQL性能优化.md

99 lines
2.1 KiB
Markdown
Raw Normal View History

2019-08-19 00:11:39 +08:00
## MySQL性能优化
2019-08-19 00:11:39 +08:00
### 使用索引
2019-08-19 00:11:39 +08:00
在前面[《关系型数据库MySQL》](../Day36-40/36-38.关系型数据库MySQL.md)一文中,我们已经讲到过索引的相关知识,这里我们做一个简单的回顾。
1. B-Tree索引
2. HASH索引
3. R-Tree索引空间索引
4. Full-text索引全文索引
2019-08-19 00:11:39 +08:00
### 使用过程
2019-08-19 00:11:39 +08:00
过程,通常也称之为存储过程。
```SQL
create procedure ... (params)
begin
...
end;
call ...
```
```Python
cursor.callproc('...')
```
2019-08-19 00:11:39 +08:00
### 数据分区
### SQL优化
1. 通过`show status`了解各种SQL的执行频率。
```SQL
show status like 'com_%';
show status like 'innodb_%';
show status like 'connections';
show status like 'slow_queries';
```
2. 定位低效率的SQL语句 - 慢查询日志。
```SQL
show processlist
```
3. 通过`explain`了解SQL的执行计划。
- select_type查询类型simple、primary、union、subquery
- table输出结果集的表
- type访问类型ALL、index、range、ref、eq_ref、const、NULL
- possible_keys查询时可能用到的索引
- key实际使用的索引
- key_len索引字段的长度
- rows扫描的行数
- extra额外信息
4. 通过`show profiles`和`show profile for query`分析SQL。
2019-08-19 00:11:39 +08:00
5. 优化CRUD操作。
2019-08-19 00:11:39 +08:00
- 优化insert语句
- 优化order by语句
- 优化group by语句
- 优化嵌套查询
- 优化or条件
- 优化分页查询
- 使用SQL提示
- USE INDEX
- IGNORE INDEX
- FORCE INDEX
2019-08-19 00:11:39 +08:00
### 配置优化
1. 调整max_connections
2. 调整back_log
3. 调整table_open_cache
4. 调整thread_cache_size
5. 调整innodb_lock_wait_timeout
2019-08-19 00:11:39 +08:00
### 架构优化
1. 通过拆分提高表的访问效率
- 垂直拆分
- 水平拆分
2. 逆范式理论
- 数据表设计的规范程度称之为范式Normal Form
- 1NF列不能再拆分
- 2NF所有的属性都依赖于主键
- 3NF所有的属性都直接依赖于主键消除传递依赖
- BCNF消除非平凡多值依赖
3. 使用中间表提高统计查询速度
2019-08-19 00:11:39 +08:00
4. 主从复制和读写分离
5. 配置MySQL集群