数据库
首页 > 数据库> > MySQL数据库优化:用10个真实案列带你掌握MySQL调优

MySQL数据库优化:用10个真实案列带你掌握MySQL调优

作者:互联网

2、explain 分析SQL的执行计划

需要重点关注type、rows、filtered、extra。

type由上至下,效率越来越高

虽然上至下,效率越来越高,但是根据cost模型,假设有两个索引idx1(a, b, c),idx2(a, c),SQL为select * from t where a = 1 and b in (1, 2) order by c;如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时,会用idx1,否则会用idx2

Extra

3、show profile 分析

了解SQL执行的线程的状态及消耗的时间。 默认是关闭的,开启语句“set profiling = 1;”


SHOW PROFILES ;

SHOW PROFILE FOR QUERY  #{id};

复制代码

4、trace

trace分析优化器如何选择执行计划,通过trace文件能够进一步了解为什么优惠券选择A执行计划而不选择B执行计划。


set optimizer_trace="enabled=on";

set optimizer_trace_max_mem_size=1000000;

select * from information_schema.optimizer_trace;

复制代码

5、确定问题并采用相应的措施

场景分析


案例1、最左匹配

索引


KEY `idx_shopid_orderno` (`shop_id`,`order_no`)

复制代码

SQL语句


select * from _t where orderno=''

复制代码

查询匹配从左往右匹配,要使用order_no走索引,必须查询条件携带shop_id或者索引(shop_id,order_no)调换前后顺序

案例2、隐式转换

索引


KEY `idx_mobile` (`mobile`)

复制代码

SQL语句


select * from _user where mobile=12345678901

复制代码

隐式转换相当于在索引上做运算,会让索引失效。mobile是字符类型,使用了数字,应该使用字符串匹配,否则MySQL会用到隐式替换,导致索引失效。

案例3、大分页

索引


KEY `idx_a_b_c` (`a`, `b`, `c`)

复制代码

SQL语句


select * from _t where a = 1 and b = 2 order by c desc limit 10000, 10;

复制代码

对于大分页的场景,可以优先让产品优化需求,如果没有优化的,有如下两种优化方式, 一种是把上一次的最后一条数据,也即上面的c传过来,然后做“c < xxx”处理,但是这种一般需要改接口协议,并不一定可行。 另一种是采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下


select t1.* from _t t1, (select id from _t where a = 1 and b = 2 order by c desc limit 10000, 10) t2 where t1.id = t2.id;

复制代码

案例4、in + order by

索引


KEY `idx_shopid_status_created` (`shop_id`, `order_status`, `created_at`)

复制代码

SQL语句

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

领取方式;关注+点赞后,戳这里即可免费领取

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

标签:10,MySQL,案列,order,索引,SQL,where,id,select
来源: https://www.cnblogs.com/dhsfdhfhgufdu/p/15104336.html