- 尽量避免非操作符的使用,在索引上使用 NOT,<> 等操作符,数据库管理系统是不会使用索引的,可以将查询语句转化为可以使用索引的查询。
- 避免对查询的列的操作,任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数,计算表达式,查询时要尽可能将操作移至等式的右边,甚至去掉函数。
- 避免不必要的类型转化,需要注意的是,尽量避免潜在的数据类型转换。如将字符型数据与数值型数据比较,会自动将字符进行转换,从而导致全表扫描。
- 增加查询的范畴限制。避免全范围的搜索。
- 合理使用__IN__ 与__EXISTS__。例如:有A,B两个表,他们分别使用如下的情况:
- 当只显示一个表的数据如 A,关系条件只加一个ID时,使用IN更合适,SQL语句如下:
select * from A where id in (select id from B)
- 当只显示一个表的数据如 A,关系条件不只一个列,例如关系条件涉及到的列为ID,col1 时,使用IN 就不方便了,可以使用EXISTS,SQL语句如下:
select * from A where EXISTS (select 1 from B where id = A.id and col1 = A.col1)
- in 与 exists 的区别:in 是把外表和内表作hash连接,而exists 是对外表作loop 循环,每次loop循环再对内表进行查询。一直来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。如果两个表中一个较小,一个是大表,则子查询大表用exists,子查询小表用in。
- 尽量去掉__<>__。尽量去掉<>,避免全表扫描,如果数据是枚举值,且取值范围固定,则修改OR 或者 IN a<>0 改为a>0 or a<0 a<>'' 改为a >''。
- 去掉where子句中的is null 和 is not null。where子句中的is null 和 is not null 将不会使用索引而是进行全表搜索,因此需要通过改变查询方式,分情况讨论等方法,去掉where子句中的is null 和 is not null ,is not null 改为A>0 或者 A>''。
- 尽量不要使用前导模糊查询。由于前导模糊查询(前面有%的like查询)不能利用索引,所以速度会比较慢。
- select 子句中避免使用 ' * '。当你想在select 子句中列出所有的column时,使用动态SQL列引用 ' * ' 是一个方便的方法,不幸的是,这是一个非常低效的方法。实际上,数据库在解析的过程中,会将' * ' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更过的时间。
- 规范所有SQL关键字的书写,比如 select,update,delete,from等,要么全部大写,要么全部小写,不要大小写混写。