【日积月累】sql执行语句优化

发布时间:2023年12月20日

目录


文章所属专区 超链接


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优化技巧

给个三连吧 谢谢谢谢谢谢了
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_43238568/article/details/135073029
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。