Mysql如何避免全表扫描
什么是全表扫描?
全表扫描,指的是执行SQL的时候,无法使用索引,导致查询和执行缓慢。除此之外的坏处是:执行缓慢可能会导致Java程序里的后续处理被阻塞,降低了 系统的响应速度,同时全表扫描导致了对数据库资源的耗时占用,降低了数据库本身的并发性能。严重的会导致使用数据库的所有应用程序的卡顿。
通常情况下,一般对于没有建立索引表查询就是全表扫描
解决方法
- 避免使用
select *
;引擎放弃使用索引造成全表扫描,使用具体字段代替 ’*‘ - 避免在 where 子句中使用’
like
‘模糊查询时(%...%,%...),引擎放弃使用索引造成全表扫描;使用’%...‘代替’%...%‘ - 避免在 where 子句中使用
(not)in
时;对于连续的数值可以使用between and,使用’(not)exists ‘代替’(not)in‘ - 避免在 where 子句中对具体字段进行null值判断(
select name from name is null
),任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的;设置默认值或者在创建表时定义为not null - 避免使用or连接符,引擎放弃使用索引造成全表扫描;使用 union all 替代 or
- 避免在 where 子句中使用
!=或<>操=作符
,引擎放弃使用索引造成全表扫描,MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE
。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头时,使用>、<
时用>=
代替>
- 避免在 where 子句中对字段
=
左边进行函数、算术运算或其他表达式运算,引擎放弃使用索引造成全表扫描; - 避免使用参数作为条件(
select name from table where name=@name
) 可以强制使用索引select name from t with(index(索引名)) where name=@name
- 避免使用
count(*)
时,引擎放弃使用索引造成全表扫描;使用count(1) 替代count(*)
- 避免使用
having
子句,用where
子句替代
阅读剩余
版权声明:
作者:涛哥
链接:https://ltbk.net/back/db/mysql/article/1464.html
文章版权归作者所有,未经允许请勿转载。
作者:涛哥
链接:https://ltbk.net/back/db/mysql/article/1464.html
文章版权归作者所有,未经允许请勿转载。
THE END