MySQL语句优化补充(一)

前面已经写了一些关于优化sql语句的方法。为了更形象的在项目中使用,以现有的数据再次详细说明一些,希望对sql优化有更进一步的学习。

一、从发现问题到解决问题

以本地数据 my_order表为例,先生成119w多条记录。

根据id查询一条数据,用时0.00s

explain 查看详情,用到了主键索引 primary key ;查询的行数row=1;

同理,若用oid 查询一条数据,用时0.26s

explain 查看一下,没用任何索引,查询的行数row=1186791

对比两条语句,差别在于where字句后的字段是否使用了索引,初步判断是因为索引的问题。先不说索引的问题。

二、先开启慢查询

1
2
3
show variables like "slow%";  

set global slow_query_log=on;

设置慢查询时间,为了更好的测试设置为0.1s,在实际项目中根据需求设置,比如设为0.5s等。

1
show variables like "%long%";

1
set long_query_time=0.1;

再次运行

1
select * from my_order where oid='o_201904060514268977';

打开慢日志文件,可查看刚才运行的语句。

三、查看性能

1
show variables like "%profiling%";

1
set profiling=on;

再次运行

1
select * from my\_order where oid='o_201904060514268977';
1
show profiles; 

可以看到刚才语句语句运行的更具体的时间。再进一步分析:

1
show profile for query 2;

通过上图可以看到详细的运行时间。其中,Sending data花费时间最长。

并且,注意:logging slow query 也花费时间,一般不要在线上开启慢查询,等需要分析的时候再启用。

四、加索引优化

增加索引,

1
alter table my_order add index(oid);

并运行:

1
select * from my_order where oid='o_201904060514268977';

再分析一下:

看来加索引解决了刚才慢查询的问题。

MySQL语句优化补充(一)

https://sunct.github.io/posts/70573c79.html

作者

sunct

发布于

2019-04-06

更新于

2020-12-24

许可协议


评论