SQL语句常见优化⼗⼤案例(MySQL)
1、慢SQL消耗了70%~90%的数据库CPU资源;
2、SQL语句独⽴于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;
3、SQL语句可以有不同的写法;mysql面试题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⼦查询⽆效,固⽣产环境应避免使⽤⼦查询
enum color{red2.避免函数索引
例:
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%';
redis版本历史----->
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,的字段进⾏排序。如果查询包括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 ate_time DESC;
----->
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;
sqlite包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');
----->
建站abc怎么样INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论