目录
文章所属专区 超链接
在实际业务场景中我们往往需要的不是一张表的全部字段,而是部分字段,写清楚需要查询的字段。
1.这种方式性能开销非常大,查询的数据量大,通过网络传输时,也会增加数据传输的时间,
2.会让优化器无法完成索引覆盖扫描这类优化。
查询语句尽量
select id, create_date
from order
where user_id=123
order by create_date asc
limit 1;
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)
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
primary key优先使用数值类型int,tinyint
因为引擎在处理查询和连接时会逐个比较字符串中每一个字符;
而对于数字型而言只需要比较一次就够了;
字符会降低查询和连接的性能,并会增加存储开销。
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;
char按声明大小存储,不足补空格;
其次对于查询来说,在一个相对较小的字段内搜索,效率更高;
避免for循环多次插入的情况,导致每条都需要事务开启和事务提交
INSERT INTO user (id,username) VALUES(1,'编程');
INSERT INTO user (id,username) VALUES(2,'妲己');
替代为
INSERT INTO user (id,username) VALUES(1,'编程'),(2,'妲己');
会导致索引失效,从而全表扫描
如果 SELECT * FROM student WHERE id_card = 5040198345 id_card 没有加单引号 会导致索引失效。
SELECT * FROM student WHERE id_card = '5040198345'
会导致索引失效,从而全表扫描
SELECT * FROM student WHERE id_card != '123'
使用or可能会使索引失效,从而全表扫描;
掌握这12个SQL优化方法,你基本上就无敌了
SQL优化篇:如何成为一位写优质SQL语句的绝顶高手!
浅谈SQL优化小技巧
15个常用的sql优化技巧
给个三连吧 谢谢谢谢谢谢了