MySql调优
调优金字塔
系统设计:数据不适合放入mysql,es、MQ、Redis、读写分离。
mysql调优:主要是索引且要熟悉业务。
mysql导致慢查询的原因是因为数据太多了。
1.sql查询
1.1尽量使用覆盖索引
1.2数据表结构,统计汇总,
1.3重写sql
1.4慢查询
1.4.1 sql查询次数多的入部门、角色缓存到redis中
1.4.2相应时间=系统处理时间+排队时间
1.4.3mysql记录所有执行超过long_query_time参数设定的时间阈值的sql日志
show variables like 'slow_query_log';( 默认关闭,默认单位是秒)
set GLOBAL show_query_log = 1;
日志存放哪里呢?
show variables like '%slow_query_log_file%'
没有用到索引的语句开启慢查询日志
show variables like '%log_queries_not_using_indexes%';
set GLOBAL log_queries_not_using_indexes= 1;
使用cat 查看日志
Rows_examinedL10567 查询了多少行。
1.4.4 mysqldumpslow 工具使用
mysqldumpslow -s r -t 10 centosvm-slow.log
显示前10行执最多行的慢日志
r:结果用的行数
c:总次数
l :锁
1.5执行计划
- 关键字explain select * from xxx
1.5.1 各项指标
id:代表的是 select 语句执行的id,id 越大代表执行顺序越早,id 最小的最慢执行。
select_type:查询类型
table:表
partitions:分区信息
type:这一列表示关联类型或访问类型,即 MySQL 决定如何查找表中的行,查找数据行记录的大概范围。一般来说,得保证查询达到 range 级别,最好达到 ref
possible_keys:这一列显示查询可能使用哪些索引来查找。这只是可能用到的索引,最终是否真的使用了,还要看 key 列
keys:最终使用的索引
key_len:这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
ref:这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)
rows:这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数
filtered:过滤信息
Extra:这一列展示的是额外信息。常见的重要值如下:Using index:使用覆盖索引;Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖;Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化;Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的;Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段是
1.5.2 id
id显示的是具体执行的有几个select 语句
union 去重,需要建立临时表,所以会显示null
1.5.2 select_type
SIMPLE:简单的select查询,不适用union及子查询
PRIMARY:最外层的select 查询
UNION:union中的第二个或随后的select查询,不依赖于外部查询的结果集。
UNION RESULT:union结果集
SUBQUERY:子查询中第一个select查询不依赖于外部查询的结果集
DEPENDENT UNION :UNION中的第二个或随后的select查询,依赖于外部查询的结果集
DEPENDENT SUBQUERY:子查询中的第一个select 查询,依赖于外部查询的结果集
DERIVED:用于from子句里有查询的情况,Mysql会递归指向这些子查询,不结果放到临时表中。
1.5.3 type重要指标
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
const 通过主键索引命中一行数据
eq_ref 连接查询通过二级索引或者主键查询后命中数据,
ref 通过二级索引命中一行数据
fulltext 通过全文索引
ref_or_null :有空或者查询字段内容则会出现ref_or_null
![](https://img-blog.csdnimg.cn/bd791e6136a84fcbb3124ac9665006e8.png)
1.5.4 index_merge 针对一张表,使用两个单独的索引进行查询则会出现还有就是增加子查询
1.5.5 range 范围查询
1.5.6 index 联合索引查询根据展示的列就是index,
1.5.7 驱动表和驱动表
通过A查询B中的数据,A就是驱动表,B就是被驱动表。