Mysql如何避免全表扫描

什么是全表扫描?

全表扫描,指的是执行SQL的时候,无法使用索引,导致查询和执行缓慢。除此之外的坏处是:执行缓慢可能会导致Java程序里的后续处理被阻塞,降低了 系统的响应速度,同时全表扫描导致了对数据库资源的耗时占用,降低了数据库本身的并发性能。严重的会导致使用数据库的所有应用程序的卡顿。

通常情况下,一般对于没有建立索引表查询就是全表扫描

解决方法

  1. 避免使用select *  ;引擎放弃使用索引造成全表扫描,使用具体字段代替 ’*‘
  2. 避免在 where 子句中使用’like ‘模糊查询时(%...%%...),引擎放弃使用索引造成全表扫描;使用’%...‘代替’%...%‘
  3. 避免在 where 子句中使用(not)in  时;对于连续的数值可以使用between and,使用’(not)exists ‘代替’(not)in‘
  4. 避免在 where 子句中对具体字段进行null值判断(select name from name is null ),任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的设置默认值或者在创建表时定义为not null
  5. 避免使用or连接符,引擎放弃使用索引造成全表扫描;使用 union all 替代 or
  6. 避免在 where 子句中使用!=或<>操=作符 ,引擎放弃使用索引造成全表扫描,MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE 。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头时,使用>、< 时用>= 代替> 
  7. 避免在 where 子句中对字段= 左边进行函数、算术运算或其他表达式运算,引擎放弃使用索引造成全表扫描;
  8. 避免使用参数作为条件(select name from table where name=@name ) 可以强制使用索引 select name from t with(index(索引名)) where name=@name
  9. 避免使用count(*) 时,引擎放弃使用索引造成全表扫描;使用 count(1) 替代count(*) 
  10. 避免使用having 子句,用where 子句替代
阅读剩余
THE END