1.避免全表扫描,首先考虑在where 以及order by 涉及到的列上建立索引
2.避免在where字句中对字段进行null值判断,否则导致引擎放弃使用索引而进行全表扫描,select id from t where
num is null 可以在num上设置默认值(0) ,确保表中num列没有null值,然后这样查询 select id from t where num=0;
3.避免在where字句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描
4.应尽量避免在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
5.慎用in 和 not in ,否则导致全表扫描 select id from t where num in (1,2,3)对于连续的数值,能用between 就不要用in
可以写为: select id from t where num between 1 and 3
6.下面查询也会导致全表扫描;select id from t where name like '%xiaoli%' ,若要提高效率,考虑全文检索
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以abc开头的id应该为 select id from t where name like 'abc%'
10 不要在where字句中的“=”左边进行函数、算术运算、或其他表达式运算,否则系统法务使用索引。
11.在使用索引字段作为条件时,如果该索引是复合所以你
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上建了索引也对查询效率起不了作用。
15. 索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
16,尽可能避免更新clustered 索引
17尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,
会增加存储开销。这是因为索引在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了
18.尽可能使用varchar/nvarchar代替char/nchar,首先变长字段存储空间小,
可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率明显要高一些
转载地址:https://blog.youkuaiyun.com/u014421556/article/details/52063904
2548

被折叠的 条评论
为什么被折叠?



