1、服务器层面:参数配置优化、减少客户端使用连接数 --可考虑使用缓存
2、架构层面:”读写分离、分库、分表、分片
3、业务sql层面:查看慢查询日志、sql优化
show variables like '%slow_query%'; ---默认关闭
show variables like '%long_query%'; ---多长时间是慢查询呢?
怎么修改默认配置?
vim /etc/my.cnf
查看最慢的10条sql日志
mysql -u root -p
show full processlist; ---查看客户端链接
show global status;---查看服务端状态值
show engine innodb status;-- 查看innodb状态
explain执行顺序怎么看?
总节:id查询顺序,先从大到小,再从上到下。调整表顺序,可得到不同id执行顺序。优化原则,小表驱动大表,即小表放前面
一、具体案例
我们来执行一条非常简单的代码:
expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;
执行之后的结果如下:
发现出来了很多的字段,这么多字段其实也没必要每个都重点关注,上面图片用红色框框标出了5个字段,这些是需要重点关注的。下面具体来说说这5个字段的含义。
1.type
表示访问表的方式,一共有6种。
从最好到最差的结果依次如下:
system > const > eq_ref > ref > range > index > ALL
注意:一个好的SQL语句至少要达到range级别!杜绝出现all级别。
system: 表示结果集仅有一行;
const: 表示通过主键或者唯一键键查找数据时只匹配最多一行数据;
eq_ref: 该类型多出现在多表join场景,通过主键或者唯一键访问表;
对于前表b的每行记录,都只能匹配到后表a的一行记录并且查询的比较操作通常是=,查询效率较高。
ref: 此类型通常出现在sql使用非唯一或非主键索引, 或者是使用最左前缀规则索引的查询;
range: 表示where条件使用索引范围查询,当 type 是 range 时,ref 字段为 NULL。
index: 表示全索引扫描, 扫描所有的索引记录, 而不扫描数据;
index 类型通常会出现在覆盖索引中,所要查询的数据直接在索引中就可以访问, 而不用回表扫描数据. 此时Extra 字段 会显示 Using index。
还有一种是全表扫描时通过索引顺序访问数据。此时并不会在Extra提示 using index。
ALL: 表示执行计划选择全表扫描,当执行计划出现type 为all 时,我们尽量通过修改索引的方式让查询利用索引。
2.key
此字段是 MySQL 在当前查询时所真正使用到的索引。
如果没有选择索引,值是NULL。
可以采取强制索引方式。
3.key_len
key_len表示执行计划所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列。
key_len 大小的计算规则是:
一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes;
如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes;
若该列类型定义时允许NULL,其key_len还需要再加 1 bytes;
若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes。
4.rows
表示的是扫描行数。
记住:该值是个预估值,所以并非是完全准确的值。
MySQL 查询优化器根据统计信息,估算 SQL 要查找到结果集需要扫描读取的数据行数。
原则上 rows 越少越好。
5.extra
该列会提示优化执行计划的额外的信息。
注意,常见的不太友好的、值得大家关注的有如下几种:
Using index。表示该sql利用覆盖索引扫描,也即从只访问索引即可获取到所需的数据,而不用回表。
Using where。表示该sql 回表获取数据了。什么是回表呢? 其实就是仅仅通过访问索引不能满足获取所需的数据,需要访问表的page 页。
如果和Using index 同时出现,说明where条件通过索引定位数据,然后回表,再过滤所需要的数据。
Using filesort。说明排序没有利用索引而发生了额外排序 ,伴随着的可能还有Using temporary。
其实还有其它一些 提示Using MRR、Using index condition 、Using index for group-by,这些提示是正向的,说明sql比较优化。
6.其它字段
前面讲了5个比较重要的字段,相信很多求知欲强的小伙伴也想知道其它字段是什么意思,这里也一并列出来,以供参考:
字段含义
id查询语句的序号或者说是标识符
select_type表示查询的类型,常见的有如下6种
table其值为表名或者表的别名,表示访问哪一个表
partitions匹配的分区
possible_keys表示查询时,可能使用的索引
filtered按表条件过滤的行百分比 越高越好,越高表示返回给server层数据越准确,100表示server层无需再过滤,减少性能消耗
explain format=json select * from schn_shop_goods order by goods_id;---加上format=json 可得到更详细信息入cost成本数据等
常见优化
-----后续具体案例再添加
https://www.mysqlzh.com/doc/64.html---mysql中文参考文档
https://dev.mysql.com/doc/refman/5.7/en/ ---mysql官网