Sql的一些优化经验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiong9999/article/details/84261897

Sql的一些优化经验

1.like模糊匹配

a、取消like,用具体的值。
b、根据like先创建一个临时表,然后通过临时表关联查询。
c、多级嵌套的查询或者更新,可以拆成多步、或者用临时表

2.索引字段

不要在建立的索引的数据列上进行下列操作:
◆避免对索引字段进行计算操作
◆避免在索引字段上使用not,<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出现数据类型转换
◆避免在索引字段上使用函数
◆避免建立索引的列中使用空值。

最主要的:
1. 在创建表时,要充分考虑这个表以后查询时可能用到的常用字段,并创建索引
2. 创建索引时,要避免选择字段中的值为重复的
如:sex字段有只有两个类型:男女,如果在这个字段上创建索引,其实是没有意义的。
3. 创建索引时,要避免选择字段中的值出现null的情况

3.where字段

a、避免在索引字段上使用函数,如:
where createDate>=to_date(#{date})

b、尽量使用 exist 和not exist代替 in和not in

exists做为where 条件时,是先对where 前的主查询询进行查询,
然后用主查询的结果一个一个的代入exists的查询进行判断,
如果为真则输出当前这一条主查询的结果,否则不输出
  • exist会针对子查询的表使用索引.
  • not exist会对主子查询都会使用索引.
  • in与子查询一起使用的时候,只能针对主查询使用索引.
  • not in则不会使用任何索引. 注意,一直以来认为exists比in效率高的说法是不准确的。
  • in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
  • 如果查询的两个表大小相当,那么用in和exists差别不大。
  • 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in
  • 外大内小用in效率极低,用exists效率很高
  • 外小内大时使用in比exists效率更高
  • exits适合内小外大的查询,in适合内大外小的查询

例如:表A(小表),表B(大表)
1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
2:相反的 select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。

  • 如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
  • 而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
4.传递参数时

不要以字符格式声明数字,要以数字格式声明字符值。如:

SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
--不要使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = ‘7369’

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiong9999/article/details/84261897