1. 添加索引
1). 什么时候考虑添加索引?
数据量大; 频繁查询;
2). 针对什么样的字段添加索引?
where 后面的条件; 针对数据波动范围大;
3). 数据库表的索引是否越多越好 ? 太多会有什么影响?
不是; 太多了, 会对insert , update 的效率产影响.
4). 索引的使用规则?
explain 指令来查看查询计划.
2. select 语句中 尽量不适用 select * from..., 使用具体的字段代替 select name , age from ...;
---> select * , * 代表所有的列, 不同的表, 列也不同, 需要解析列, 会查找所有的字段. 效率低.
3. where 和 having, where子句中不能跟组函数. 当使用where 和 having 都可以使用时, 尽量使用where.
1). select deptno, avg(sal) from emp where deptno = 10 group by deptno; ---> 先过滤,后分组, 分组的对象数据少, 效率高.
2). select deptno, avg(sal) from emp group by deptno having deptno = 10; ---> 先分组后过滤.
4. 如果需要查询多张表, 可以使用子查询, 也可以使用多表查询时, 理论上,尽量使用多表查询 ---> 因为性能高.
因为子查询, 对数据操作两次或多次, 而多表查询则只操作一次, 所以效率高---------> 不考虑笛卡尔积的情况下.
但是,如果表中的数据太多, 多表产生的笛卡尔积太大, 会影响多表查询的效率.
5. 尽量不使用集合运算.
参与运算的集合越多, 运行效率越低. UNION(并集) , UNION ALL(全并集) , INTERCEPT(交集) , MINUS(差集)
6. 尽量不适用in操作符.
ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采
用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程
在业务密集的SQL当中尽量不采用IN操作符,用 EXISTS 方案代替。
7. 强烈不建议使用 not in 操作符.
此操作是强列不推荐使用的,因为它不能应用表的索引 ; 可以使用not exists来替代.
8. IS NULL 或IS NOT NULL操作(判断字段是否为空)
判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的 ;
用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>''等。不允许字段为空,
9. LIKE的模糊查询如果用的不好也会降低性能.
LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,
如LIKE '%5400%' 这种查询不会引用索引,而LIKE '5400%'则会使用索引
10. 避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能.
11. 在WHERE 语句中,尽量避免对索引字段进行计算操作