避免全表扫描的sql优化(2)

来源:未知 责任编辑:责任编辑 发表时间:2014-03-23 22:31 点击:

 
   select id from t where num between 1 and 3
 
 
 
  5.下面的查询也将导致全表扫描:
 
       select id from t where name like '%abc%' 或者
 
       select id from t where name like '%abc' 或者
 
       若要提高效率,可以考虑全文检索。
 
      而select id from t where name like 'abc%' 才用到索引
 
 
 
 7. 如果在where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推 迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
 
    select id from t where num=@num
 
   可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num
 
 
 
 8.应尽量避免在where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
 
 如:
 
  select id from t where num/2=100
 
应改为:
 
 select id from t where num=100*2
 
 
 
9. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
 
如:
 
select id from t where substring(name,1,3)='abc'--name
 
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id 应改为:
 
 
 
select id from t where name like 'abc%'
 
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
 
 
 
10.不要在where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
 
 
 
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
 
 
 
12.不要写一些没有意义的查询,
 
如需要生成一个空表结构:
 
 select col1,col2 into #t from t where 1=0
 
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:create table #t(...)
 
 
 
13.很多时候用exists 代替in 是一个好的选择:
 
select num from a where num in(select num from b)
 
用下面的语句替换:
 
select num from a where exists(select 1 from b where num=a.num)
 
 
 
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • mysql-mmm
  • mysqldump命令——MySQL数据库备份还原
  • Oracle数据导入MySQL的快捷工具:MySQL Migration Toolkit
  • 简简单单储存过程——循环一个select结果集
  • MySQL数据库十大优化技巧
  • Mysql安装笔记
  • Mysql主主复制架构配置
  • Mysql的Procedure 参数为NULL问题分析
  • MySQL Stmt预处理提高效率问题的小研究
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1