mysql查询慢的⼏个优化点
其实好久没碰SQL了,但还是记录下之前碰到的⼀些优化点吧。
⼏点常见的我就直接⼀笔带过了
1.sql语句中不要出现null
例⼦如下:select * from test where id is not null;
2.尽量少⽤not条件
包括:<>、NOT、in、not exists
例⼦如下:select * from test where id in(1,2,3,4,5);
3.Like通配符后匹配
select * from test where id like ‘%a’;
不要把%写在最前⾯,这样等于没做,还是全表扫描
改成select * from test where id like 'a%'等等,视情况⽽定;
4.函数运算
select * from test where upper(name) = ‘SUN’;
需要改成
select * from test where name = upper(‘sun’);
意思就是不要对你存在索引的查询列做函数运算
5.避免数据类型的隐式转换,这⾥的id在数据库是int类型
select * from test where id = ‘123’
这⾥数据库会做隐式转换,把id从int转换成varchar,⽆形之中浪费了时间
6.复合索引前导列区分不⼤
select * from test where sex = 0
这⾥sex是性别,只有0和1两种情况,假设你的index索引是(sex,name),这⾥sex作为前导列,对于数据的区分并不⼤,所以对于mysql 优化器⽽⾔,还不如⾛全表扫描,所以对应的索引也就失效了,需要注意。前导列应当选取可以把数据区分成尽量多块的字段,否则等于⽆意义。
------------------还有就是平时碰到的⼀些常见情况-------------------------
优化⽬标
1.减少 IO 次数
IO是数据库最容易出现瓶颈的地⽅,程序建⽴数据库连接,释放连接,会耗时⽐较久,⼤部分数据库操作中超过90%的时间都是 IO 操作所占⽤的,减少 IO 次数是 SQL 优化中第⼀优先考虑的点,当然,也是收效最明显的优化⼿段。
譬如: 我要去数据库取1000条符合条件的数据
⽅案1:for循环查询1000次groupby是什么函数
⽅案2:根据条件把尽量符合的数据先做筛选出来,如果有不符合的数据再在内存中做处理。
这⾥我推介⽅案2, 尤其当数据量越⼤的时候,达到1w+,甚⾄⼏万的时候,你的sql语句在数据库尽量只做查询,且不要带什么函数(譬如orderby,groupby),连表不要超过三张(视情况⽽定),当你把数据拿到内存中后,可以进⾏排序和分组(JAVA8是⽀持做分组的,单个key或者多个key都可以),你会发现在内存做处理会⽐你在sql上加⼀堆条件快很多,数据量越⼤越明显。
2.尽量减少连表操作
有些时候我们的数据库是做的⽇分表这种,那这就很⿇烦了,因为不做分表的话,数据量会太⼤了,尤其是mysql,单表数据太⼤会出现很多问题,⽐如删个表就卡死了,等等情况。
⽅案1:做分区表,mysql 5.1以后⽀持创建分区表
⽅案2:存储过程定时每天将表做成视图(但是第⼀次查询时会较慢,因为需要预编译形成⼀整张view视图)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。