1 外键必须加索引。
2 SELECT语句中避免使用 *,尽量应该根据业务需求按字段进行查询
3 在 where 及 order by 涉及的列上建立索引,要尽量避免全表扫描。
4 在设计表时要避免表中字段出现null的情况,通常要为其设置默认值,避免在查找时放弃使用索引而进行全表扫描(null的话如果有索引不生效)。
5 用>=替换>
如一个表有100万记录,一个数值型字段A,
A=0时,有30万条;
A=1时,有30万条;
A=2时,有39万条;
A=3时,有1万记录。
那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时,
ORACLE会先找出为2的记录索引再进行比较,
而A>=3时ORACLE则直接找到=3的记录索引。
6 用NOT EXISTS/EXISTS 替换 NOT IN / IN
NOT IN / IN不能应用表的索引
7 LIKE操作符(大数据的全文检索使用luncene)(solr)
因为使用like不当,会导致性能问题,原因是like在左右两边都有
%的时候,不会使用索引。
如LIKE '%5400%' 这种查询不会引用索引而是全表扫描,
而LIKE 'X5400%' 则会引用范围索引。
8 避免在索引列上使用计算和函数,这样索引就不能使用
举例: sal为索引列
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
2.6 用UNION-ALL 替换UNION,
因为UNION-ALL不会过滤重复数据而且不会自动排序,所执行效率要快于UNION。
9 减少访问数据库的次数,可以使用缓存,分段提交等处理
举例:如果批量删除多条数据,可以用 delete from tableName where id in (1,2,3), 而不要用多条delete语句进行删除