Sql优化(索引类型、失效场景、执⾏计划)
1、执⾏计划
是SQL在数据库中执⾏时的表现情况,通常⽤于SQL性能分析,优化等场景。在MySQL使⽤ explain 关键字来查看SQL的执⾏计划
2、如何查看sql执⾏计划
在查询语句前加explain关键字,作用如下:
- 查看表的读取顺序,根据id大小判断,id越大优先级越大,id相同则按顺序执行
- 查看数据库读取操作的操作类型
- 查看哪些索引有可能被⽤到
- 查看哪些索引真正被⽤到
- 查看表之间的引⽤
3、字段分析:
-
id:select 查询的序列号,包含⼀组数字,表示查询中执⾏Select⼦句或操作表的顺序(d值相同:执⾏顺序由上⽽下;id值不同:id值越⼤优先级越⾼)
-
select_type:表示SELECT语句的类型。
-
table:显示这查询的数据是关于哪张表的。
-
type:区分索引,这是重要的列,显示连接使⽤了何种类型。从最好到最差的连接类型为:
system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery
> range > index > ALL
⼀般来说,得保证查询⾄少达到range级别,最好能达到ref,到index就可以
-
possible_keys:指出MySQL能使⽤哪个索引在该表中找到⾏。如果是空的,就是没有相关的索引
-
key:实际使⽤到的索引。如果为NULL,则没有使⽤索引
-
key_len:最⻓的索引宽度。如果键是NULL,⻓度就是NULL。在不损失精确性的情况下,⻓度越短越好。
-
ref:显示使⽤哪个列或常数与key⼀起从表中选择⾏
-
rows:显示MySQL认为它执⾏查询时必须检查的⾏数
-
Extra:执⾏状态说明,该列包含MySQL解决查询的详细信息
4、优化
SELECT语句务必指明字段名称(避免直接使⽤select * )
SQL语句要避免造成索引失效的写法
SQL语句中IN包含的值不应过多
当只需要⼀条数据的时候,使⽤limit 1
如果排序字段没有⽤到索引,就尽量少排序
如果限制条件中其他字段没有索引,尽量少⽤or
尽量⽤union all代替union
避免在where⼦句中对字段进⾏null值判断
不建议使⽤%前缀模糊查询
避免在where⼦句中对字段进⾏表达式操作
Join优化 能⽤inner join 就不⽤left join right join,如必须使⽤ ⼀定要已⼩表为驱动 A left join B
5、索引的类型
普通索引、唯⼀索引、主键索引、复合索引
6、失效场景
使⽤函数或表达式查询、使⽤ NOT 或 != 操作符、使⽤or操作符、对索引列进⾏运算、like模糊查
询前置%、多个索引查询,只有第⼀个有效