简单说了一下SQL语句的优化,实际上就是要如何命中索引
SQL优化
- 对查询时,应该尽量避免全表扫描,首先应该考虑在
where
和order by
上涉及的列上建立索引 - 应该尽量避免对
where
子句中对字段进行null
值判断,否则会导致引擎放弃使用索引而进行全表扫描,如select id from t where num is null
,最好不要给数据库留NULL
值,应该尽可能使用NOT NULL
填充数据库,不要以为NULL
值不需要空间,比如char(100)
型,在字段建立时,空间就固定了,不管是否插入值,都是要占用100个字符的空间,但是如果是varcahr
这种变长的字段,null
不占用空间 - 应该尽量避免在
where
子句中使用!=
或<>
操作符,否则将使用引擎进行全表扫描 - 应该尽量避免在
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’
in
和not in
也要慎用,否则会导致全表扫描如
select id from t where num in (1,2,3)
可以使用exist、any函数进行优化
- 不要在
where
子句中的=
号左边进行函数、算术运算或者其他表达式运算,否则系统将可能使用索引 - 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则索引将不会被使用,并应该尽可能地让字段顺序与索引顺序相同
- 不要使用
count(*)
这样不带任何条件的count
,这会引起全表扫描,并且没有任何意义 - 索引不是越多越好,索引固然可以提高相应的搜索效率,但是也会降低
insert
和update
时可能会重建索引,所以怎么样建立索引应该慎重考虑,视具体情况而定,一个表的索引数最好不超过6个 - 应该尽量使用数字类型而不是字符类型,因为字符类型会一个字节一个字节的比较而数字类型只会比较一次.