93.MySQL性能优化.md 2.1 KB
Newer Older
J
jackfrued 已提交
1
## MySQL性能优化
2

J
jackfrued 已提交
3
### 使用索引
4

J
jackfrued 已提交
5
在前面[《关系型数据库MySQL》](../Day36-40/36-38.关系型数据库MySQL.md)一文中,我们已经讲到过索引的相关知识,这里我们做一个简单的回顾。
6 7 8 9 10 11

1. B-Tree索引
2. HASH索引
3. R-Tree索引(空间索引)
4. Full-text索引(全文索引)

J
jackfrued 已提交
12
### 使用过程
13

J
jackfrued 已提交
14
过程,通常也称之为存储过程。
15 16 17 18 19 20 21 22 23 24 25 26 27 28

```SQL
create procedure ... (params)
begin
...
end;

call ...
```

```Python
cursor.callproc('...')
```

J
jackfrued 已提交
29
### 数据分区
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62



### 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。

J
jackfrued 已提交
63
5. 优化CRUD操作。
64

J
jackfrued 已提交
65 66 67 68 69 70 71 72 73 74
   - 优化insert语句
   - 优化order by语句
   - 优化group by语句
   - 优化嵌套查询
   - 优化or条件
   - 优化分页查询
   - 使用SQL提示
     - USE INDEX
     - IGNORE INDEX
     - FORCE INDEX
75

J
jackfrued 已提交
76
### 配置优化
77 78 79 80 81 82 83

1. 调整max_connections
2. 调整back_log
3. 调整table_open_cache
4. 调整thread_cache_size
5. 调整innodb_lock_wait_timeout

J
jackfrued 已提交
84
### 架构优化
85 86 87 88 89 90 91 92 93 94 95

1. 通过拆分提高表的访问效率
   - 垂直拆分
   - 水平拆分
2. 逆范式理论
   - 数据表设计的规范程度称之为范式(Normal Form)
     - 1NF:列不能再拆分
     - 2NF:所有的属性都依赖于主键
     - 3NF:所有的属性都直接依赖于主键(消除传递依赖)
     - BCNF:消除非平凡多值依赖
3. 使用中间表提高统计查询速度
J
jackfrued 已提交
96 97
4. 主从复制和读写分离
5. 配置MySQL集群
98