数据库优化之SQL语句优化

数据库优化之SQL语句优化

数据库优化之SQL语句优化

数据库优化涉及到的方方面面有很多,本文只针对SQL语句的优化跟大家做一个简单的探讨。

大家都知道,访问数据表主要有两种方式:一是全表扫描;二是通过数据索引扫描。索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。因此,在进行SQL语句优化前,我们有必要对数据表建好必要的索引,而要建立恰到好处的索引,需要遵循如下原则:

ü 最频繁使用的、用以缩小查询范围的字段。如在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

ü 最频繁使用的、需要排序的字段。如在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

ü 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

ü 如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

那么,在实际开发过程中,我们应该怎样去编写SQL语句,尽量避免全表扫描以提高查询速度呢?下面给出我在实践中遇到的以及在某些资料上学习到的一些经验:

1. 应尽量避免使用“select * ”进行查询,字段提取要按照“需多少、提多少”的原则。原因是:数据库在解析的过程中,会将 '*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where num is null.

解决方法: 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0.

3. Like语句是否会引起全表扫描取决于通配符的类型,如:name like %张 或 name like %张% ,会引起全表扫描,而name like 张% 不会。原因是:通配符%在字符串的开头使得索引无法使用。

4. 应尽量避免非操作符及函数引起的全表扫描,如:not、!=、<>、!<、!>、not exists、not in、not like等,另外还有函数,如:

substr(num,1,4)= 5400

优化处理:

num like 5400% .

5. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20.

解决办法:

select id from t where num=10.

union all

select id from t where num=20.

6. 用“>=”替代“>”,如:

select name from t where id>3.

优化处理:

select name from t where id >=4.

你可能喜欢

  • SQL查询语句大全
  • SQL数据库查询
  • Oracle优化
  • Oracle数据库性能优化实务
  • Oracle执行计划
  • SQL语句教程
  • 数据库优化

数据库优化之SQL语句优化相关文档

最新文档

返回顶部