SQL的优化

1.避免使用 select *

不会走覆盖索引,会出现大量的回表操作,多查出来的数据,通过网络 IO 传输的过程中,也会增加数据传输的时间.

2.用 union all 代替 union

union关键字后,可以获取排重后的数据,排重的过程需要遍历、排序和比较,它更耗时,更消耗 cpu 资源。

3.小表驱动大表

in 适用于左边大表,右边小表。
exists 适用于左边小表,右边大表。

4.批量操作

5.用 limit返回需要的数据行

6.避免in 中值太多

7.用连接查询代替子查询,join 的表不宜过多

子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗。
阿里巴巴开发者手册的规定,join 表的数量不应该超过3个。
left join:求两个表的交集外加左表剩下的数据。
inner join:求两个表交集的数据。

8.高效的分页

select id,name,age from user limit 10,20;
select id,name,age from user where id > 1000000 limit 20;

9.控制索引的数量

阿里巴巴的开发者手册中规定,单表的索引数量应该尽量控制在5个以内,并且单个索引中的字段数不超过5个。

10.提升 group by 的效率

使用 where 条件在分组前,就把多余的数据过滤掉了,这样分组时效率就会更高一些。

11.索引优化

在这里插入图片描述select_type:表示SELECT的类型,常见的取值有:
SIMPLE 简单表,不使用表连接或子查询
PRIMARY 主查询,即外层的查询
UNION UNION中的第二个或者后面的查询语句
SUBQUERY 子查询中的第一个


table:输出结果集的表(表别名)


type:表示MySQL在表中找到所需行的方式,或者叫访问类型。常见访问类型如下,从上到下,性能由差到最好:
ALL 全表扫描
index 索引全扫描
range 索引范围扫描
ref 非唯一索引扫描
eq_ref 唯一索引扫描
const,system 单表最多有一个匹配行
NULL 不用扫描表或索引


possible_keys: 表示查询可能使用的索引。

key: 实际使用的索引。

key_len: 使用索引字段的长度。

ref: 使用哪个列或常数与key一起从表中选择行。

rows: 扫描行的数量。

filtered: 存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比)。


Extra: 执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。
Using Index 表示索引覆盖,不会回表查询
Using Where 表示进行了回表查询
Using Index Condition 表示进行了ICP优化
Using Flesort 表示MySQL需额外排序操作, 不能通过索引顺序达到排序效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值