性能调优思路

总的思路是自顶向下,首先要理清请求过程

nginx
->
web container
->
spring mvc controller
->
查询redis
->
调用dubbo接口
->
业务算法
->
发送mq
->
查mysql
->
组装数据
->
返回给调用方

mysql优化

注意事项

IS NULL、IS NOT NULL、!=并不是不走索引,而是mysql优化器作出判断,如果扫描二级索引记录过多(index dive),那么回表次数也会过多,不如直接扫聚簇索引来得快,是一个成本的问题。

count(1) count(*) count(field)区别
MyIsam引擎没区别,存储了行数
Innodb下 count(field)不计算Null列耗时长一些,count 1 和 * 性能相当

mysql的join算法:
Simple Nested-Loop Join(简单的嵌套循环连接)暴力双重循环
Index Nested-Loop Join(索引嵌套循环连接)匹配的字段需要建立索引
Block Nested-Loop Join(缓存块嵌套循环连接)如果无法使用Index Nested-Loop Join的时候,数据库是默认使用的是Block Nested-Loop Join算法的。
——需要开启,block_nested_loop为on ,可用Show variables like ‘optimizer_switc%’; 查看
image-20211101111032661
设置join buffer 的大小
通过join_buffer_size参数可设置join buffer的大小
指令:Show variables like ‘join_buffer_size%’;
image-20211101111114252

系统配置优化

针对分布式

分库分表

针对高可用

读写分离

建表时

注意数据类型和存储引擎,添加适当的索引
允许反范式(部分数据冗余),避免join操作
数据量大可进行分区

使用时

增加前置缓存
插入时用批量
分页时limit offset不可过大,过大可用条件或倒序方式解决
!关注执行计划,确保用到索引

索引优化

不符合最左匹配导致索引失效,like ‘%’开头,
对列使用函数导致索引失效
使用or条件时,前后查询字段必须都是索引,
尽量使用覆盖索引;
数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描;
全表速度更快时,索引失效;

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注