1、参数是子查询时,使用exists替代in,或者使用连接替代in,虽然in非常方便,但是会成为性能瓶颈
2、会进行排序的代表性运算有:
group by
order by
聚合函数(sum count avg max min)
distinct
集合运算符(union intersect except)
窗口函数(rank row_number等)
通过指定带索引的列作为group by和order by的列,可以实现高速查询
3、使用索引时,条件表达式的左侧应该是原始字段,把运算的表达式放到查询条件的右侧,否则在查询条件的左侧使用时不能用到索引
下面几种否定形式不能用到索引,会进行全表扫描
<>
!=
not in
4、在col1和col2上分别建立了不同的索引,或者建立了(col1,col2)这样的联合索引时,如果使用or连接条件,那么要么用不到索引,要么用到了但是效率比and差得多
5、联合索引的第一列必须写在查询条件的开头,而且索引中列的顺序不能颠倒
6、使用like时,只有前方一致的匹配才能用到索引
7、默认的类型转换不仅会增加额外的性能开销,还会导致索引不可用,所以在需要类型转换时显式地进行转换
8、sql中子查询的结果会被看成一张新表,频繁使用中间表会带来2个问题,一是展开数据需要耗费内存资源,二是原始表中的索引不容易使用到,特别是聚合时,因此尽量减少中间表的使用可以提升性能
9、需要对多个字段使用in时,将它们汇总到一处,如
select * from address where id ||sate||city in (select id||state||city from addressn)
或者 select * from address where (id,sate,city) in (select id,state,city from addressn)
第二种写法比第一种更好,不用担心连接字段时出现的类型转换问题,且不会对字段进行加工,因此可以使用索引
10、连接和聚合同时使用时,先进行连接操作可以避免产生中间表
11、视图的定义语句中包含以下运算时,sql会非常低效,执行速度也会变得非常慢
聚合函数(sum count avg max min)
集合运算符(union intersect except等)
要避免在视图中进行聚合操作