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会在 分组前就把所需数据筛选掉了

 

posted on 2021-12-02 17:44  alibaba保安  阅读(42)  评论(0编辑  收藏  举报