mysql 性能优化

1、服务器层面:参数配置优化、减少客户端使用连接数 --可考虑使用缓存

2、架构层面:”读写分离、分库、分表、分片

3、业务sql层面:查看慢查询日志、sql优化


show variables like '%slow_query%'; ---默认关闭

查看日志路径

show variables like '%long_query%'; ---多长时间是慢查询呢?

慢查询时间设置

怎么修改默认配置?

vim /etc/my.cnf

linux 文件路径


修改参数


查看最慢的10条sql日志 

mysql -u root -p 

show full processlist; ---查看客户端链接

查看客户端链接

show global status;---查看服务端状态值

show engine innodb  status;-- 查看innodb状态


innodb运行状态、查看死锁IO等

explain执行顺序怎么看?

id值不同 按ID从大到小执行


id值相同,从上到下执行

总节: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比较优化。

extra

6.其它字段

前面讲了5个比较重要的字段,相信很多求知欲强的小伙伴也想知道其它字段是什么意思,这里也一并列出来,以供参考:

字段含义

id查询语句的序号或者说是标识符

select_type表示查询的类型,常见的有如下6种

table其值为表名或者表的别名,表示访问哪一个表

partitions匹配的分区

possible_keys表示查询时,可能使用的索引

filtered按表条件过滤的行百分比 越高越好,越高表示返回给server层数据越准确,100表示server层无需再过滤,减少性能消耗

explain字段含义

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官网

你可能感兴趣的:(mysql 性能优化)