数据库调优到底调什么?
- 调SQL语句:根据需求创建结构良好的SQL语句【实现同一个需求,SQL语句写法很多】
- 调索引:索引创建原则
- 调数据库表结构
- 调MySQL配置:最大连接数,连接超时,线程缓存,查询缓存,排序缓存,连接查询缓存…
- 调MySQL宿主机OS:TCP连接数,打开文件数,线程栈大小…
- 调服务器硬件:更多核CPU、更大内存
- MySQL客户端:连接池(MaxActive,MaxWait),连接属性
前置工作:
1、数据库压力测试
- 配置数据库驱动
- 配置线程组
- 配置 JDBC 连接池
- 添加 JDBC 请求
- 添加结果监听器
2、客户端-连接池
连接池参数设置
- MaxWait 参数表示从连接池获取连接的超时等待时间,单位毫秒。
- MaxActive
正式调优
一、SQL语句优化
1、查看SQL执行计划【Explain】
- id:SELECT识别符,这是SELECT查询序列号。
- select_type:表示单位查询的查询类型,比如:普通查询、联合查询(union、union all)、子查询等复杂查询。
- table:表示查询的表
- partitions:使用的哪些分区(对于非分区表值为null)。
- type(重要)表示表的连接类型。
- possible_keys:此次查询中可能选用的索引
- key:查询真正使用到的索引
- key_len:显示MySQL决定使用的索引size
- ref:哪个字段或常数与 key 一起被使用
- rows:显示此查询一共扫描了多少行,这个是一个估计值,不是精确的值。
- filtered: 表示此查询条件所过滤的数据的百分比
- Extra:额外信息
2、索引优化
3、深分页LIMIT优化
4、子查询优化 (减少子查询,多用join)
5、其他查询优化
- 小表驱动大表
- 避免全表扫描
- WHERE条件中尽量不要使用not in语句,建议使用not exists
- 利用慢查询日志、explain执行计划查询、show profile查看SQL执行时的资源使用情况
6、SQL语句性能分析
二、数据库优化
1、慢查询日志
2、连接数max_connections
3、线程使用情况
4、数据库优化-结构优化
- 将字段很多的表分解为多个表
- 增加中间表
- 增加冗余字段
三、服务器层面的优化
1、缓冲区优化
- 修改buffer_pool