SQL优化

本文最后更新于:2021年9月20日 上午

简单说了一下SQL语句的优化,实际上就是要如何命中索引

SQL优化

  1. 对查询时,应该尽量避免全表扫描,首先应该考虑在whereorder by上涉及的列上建立索引
  2. 应该尽量避免对where子句中对字段进行null值判断,否则会导致引擎放弃使用索引而进行全表扫描,如select id from t where num is null,最好不要给数据库留NULL值,应该尽可能使用NOT NULL填充数据库,不要以为NULL值不需要空间,比如char(100)型,在字段建立时,空间就固定了,不管是否插入值,都是要占用100个字符的空间,但是如果是varcahr这种变长的字段,null不占用空间
  3. 应该尽量避免在where子句中使用!=<>操作符,否则将使用引擎进行全表扫描
  4. 应该尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,如

Select id from t where num = 10 or name = ‘frank’

可以这样查询

Select id from t where t

union all

select id from where name = ‘frank’

  1. innot in也要慎用,否则会导致全表扫描如

select id from t where num in (1,2,3)

可以使用exist、any函数进行优化

  1. 不要在where子句中的=号左边进行函数、算术运算或者其他表达式运算,否则系统将可能使用索引
  2. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则索引将不会被使用,并应该尽可能地让字段顺序与索引顺序相同
  3. 不要使用count(*)这样不带任何条件的count,这会引起全表扫描,并且没有任何意义
  4. 索引不是越多越好,索引固然可以提高相应的搜索效率,但是也会降低insertupdate时可能会重建索引,所以怎么样建立索引应该慎重考虑,视具体情况而定,一个表的索引数最好不超过6个
  5. 应该尽量使用数字类型而不是字符类型,因为字符类型会一个字节一个字节的比较而数字类型只会比较一次.

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!