SQL语句常见优化十大案例(MySQL)

 

1、慢SQL消耗了70%~90%的数据库CPU资源;

2、SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;
3、SQL语句可以有不同的写法;

下面是我总结的一些SQL常见的优化方法,每个案例都简单易懂,在开发过程中可以作为参考:

1.不使用子查询
例:

SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');

子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。
在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为

SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子查询无效,固生产环境应避免使用子查询

 

2.避免函数索引

例:

SELECT * FROM t WHERE YEAR(d) >= 2016;



由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。
应改为----->

SELECT * FROM t WHERE d >= '2016-01-01';

 

 

3.用IN来替换OR

低效查询

SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;



----->
高效查询

SELECT * FROM t WHERE LOC_IN IN (10,20,30);

 

4.LIKE双百分号无法使用到索引

SELECT * FROM t WHERE name LIKE '%de%';



----->

SELECT * FROM t WHERE name LIKE 'de%';



目前只有MySQL5.7支持全文索引(支持中文)

5、读取适当的记录LIMIT M,N

 

SELECT * FROM t WHERE 1;



----->

SELECT * FROM t WHERE 1 LIMIT 10;




6、避免数据类型不一致

SELECT * FROM t WHERE id = '19';



----->

SELECT * FROM t WHERE id = 19;




7、分组统计可以禁止排序

SELECT goods_id,count(*) FROM t GROUP BY goods_id;



默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
----->

SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;


8、避免随机取记录

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;



MySQL不支持函数索引,会导致全表扫描
----->

SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;      




9、禁止不必要的ORDER BY排序

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;



----->

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;




10、批量INSERT插入

 
  1. INSERT INTO t (id, name) VALUES(1,'Bea');

  2. INSERT INTO t (id, name) VALUES(2,'Belle');

  3. INSERT INTO t (id, name) VALUES(3,'Bernice');



----->

INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值