SQL优化
约 490 字大约 2 分钟
2025-03-16
- *避免使用select 语句,第一,实际业务场景中,可能我们真正使用的只有其中一两列;第二,select *语句不会走覆盖索引,会出现大量的回表查询,sql性能低
- 使用union all代替union,union all可以获取所有数据,包含重复的数据,不用排查重复的数据
- 批量插入、更新
- 索引优化:
- 使用explain语句判断sql语句有没有走索引,有type、key、key_len三个属性需要关注
- type:数据的访问类型,从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- **sysyem:**const连接类型的一种特例,仅有一行满足条件
- **const:**当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)
- **eq_ref:**最多只返回一条符合条件的记录,使用唯一性索引和主键查找时发生
- **ref:**一种索引访问,返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引、或者唯一性索引才会发生
- **range:**范围扫描,一个有限制的索引扫描,key列显示使用了哪个索引
- **index:**和全表扫描一样,只是扫描表的时候按照索引次序进行而不是行,避免排序,但是开销还是大
- **all:**最坏的情况,全表扫描
- **key:**显示 MySQL 实际决定使用的键(索引)。如果没有选择索引,键是 NULL
- **key_len:**显示 MySQL 决定使用的键长度。如果键是 NULL,则长度为 NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好