sql查询优化
1,使用 explain 来查看SQL 语句的执行效果,可以帮助选择更好的索引和优化查询语句 explain 详解: https://mp.weixin.qq.com/s/l3jJHIcqMzCcezbpboqyvQ
2,用具体字段代替 * 查询 select * from table
3,不在索引列做运算或者使用函数
4,查询尽可能使用limit 减少返回的行数,减少数据传输时间和带宽浪费
5,用union all代替union union排重的过程需要遍历、排序和比较,它更耗时,更消耗cpu资源。
6,小表驱动大表:
假如有order和user两张表,其中order表有10000条数据,而user表有100条数据。这时如果想查一下,所有有效的用户下过的订单列表。
可以使用in
关键字实现:
select * from order
where user_id in (select id from user where status=1)
也可以使用exists
关键字实现:
select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)
sql语句中包含了in关键字,则它会优先执行in里面的子查询语句
,然后再执行in外面的语句。
sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)
in
适用于左边大表,右边小表。exists
适用于左边小表,右边大表。
7,避免 in 中需要判断值太多
8,用连接查询代替子查询
select * from order
where user_id in (select id from user where status=1)
替换成
select o.* from order o
inner join user u on o.user_id = u.id
where u.status=1
9,join的表不宜过多
根据阿里巴巴开发者手册的规定,join表的数量不应该超过3
个。 如果join太多,mysql在选择索引的时候会非常复杂,很容易选错索引。
10,提升group by的效率
如:select user_id,user_name from order
group by user_id
having user_id <= 200;
替换成
select user_id,user_name from order
where user_id <= 200
group by user_id
where会在 分组前就把所需数据筛选掉了