【日积月累】sql执行语句优化
目录
sql执行语句优化
文章所属专区 超链接
1.前言
2.sql执行语句优化
2.1语句注意类
1.避免使用 * 查询(全表查询)
在实际业务场景中我们往往需要的不是一张表的全部字段,而是部分字段,写清楚需要查询的字段。
1.这种方式性能开销非常大,查询的数据量大,通过网络传输时,也会增加数据传输的时间,
2.会让优化器无法完成索引覆盖扫描这类优化。
2.限制查询返回数
查询语句尽量
select id, create_date
from order
where user_id=123
order by create_date asc
limit 1;
3.小数据集驱动大数据集
1.in sql语句包含了in关键字,会优先执行里面的子查询语句,再执行in外面的语句。因此in关键字适合左边大表,右边小表的情况。
select * from order
where user_id in (select id from user where status=1)
2.exists sql语句包含了exists关键字,会优先执行exists左边的语句,然后把它跟右边的语句匹配,如果匹配上就查询出数据,如果匹配不上,数据就被过滤掉了。因此exist适合左边小表,右边大表的情况。
select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)
4.group by 优化
SELECT age,COUNT(1) FROM student GROUP BY age HAVING age > 20
使用group by 分组查询时,可以先缩小查询范围。
SELECT age,COUNT(1) FROM student where age > 20 GROUP BY age
5.尽量使用数值替代字符串类型
primary key优先使用数值类型int,tinyint
因为引擎在处理查询和连接时会逐个比较字符串中每一个字符;
而对于数字型而言只需要比较一次就够了;
字符会降低查询和连接的性能,并会增加存储开销。
6.使用varchar代替char
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;
char按声明大小存储,不足补空格;
其次对于查询来说,在一个相对较小的字段内搜索,效率更高;
7.批量插入性能提升
避免for循环多次插入的情况,导致每条都需要事务开启和事务提交
INSERT INTO user (id,username) VALUES(1,'编程');
INSERT INTO user (id,username) VALUES(2,'妲己');
替代为
INSERT INTO user (id,username) VALUES(1,'编程'),(2,'妲己');
3.误操作导致索引失效
1.避免查询条件字符串没有加’’
会导致索引失效,从而全表扫描
如果 SELECT * FROM student WHERE id_card = 5040198345 id_card 没有加单引号 会导致索引失效。
SELECT * FROM student WHERE id_card = '5040198345'
2.避免使用!=或<>
会导致索引失效,从而全表扫描
SELECT * FROM student WHERE id_card != '123'
3.避免在where自句中使用or来链接条件
使用or可能会使索引失效,从而全表扫描;
4.一次sql最好只请求一张表,减少子查询多表查询的情况
4.参考
掌握这12个SQL优化方法,你基本上就无敌了
SQL优化篇:如何成为一位写优质SQL语句的绝顶高手!
浅谈SQL优化小技巧
15个常用的sql优化技巧
给个三连吧 谢谢谢谢谢谢了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!