5段SQL可以测试出你对SQL性能优化知识了解多少

数据库是很强大的,它可以实现超预期的执行性能。但是很多人很容易写出不能发挥最高效算法的SQL查询语句,因而也容易产生无法预期的性能结果。

       下面UncleToo为大家整理出5段SQL,都是大家平时经常写的SQL,但是稍微经过一些优化,或者换种写法,也许他的执行效率就会高出好几倍,大家也可以对照自己平时的写法,看看自己是否还有继续学习的空间。

       本文介绍的SQL是基于ORACLE数据库的。


1、查询2014年所有的行

1
2
CREATE  INDEX  tbl_idx  ON  tbl (date_column);
SELECT  text,date_column  FROM  tbl  WHERE  TO_CHAR(date_column, 'YYYY' ) =  '2014' ;

       有过SQL优化经验的人也许会问,这样写没问题啊,将出现在条件中的字段加索引,可以起到优化SQL的作用,怎么会有问题呢?有这样疑问的朋友对数据库优化还是有所了解的,但是你忽略了一点:不管是ORACLE还是其他数据库,一旦将字段放在函数里执行,该字段的索引将不起作用。那么正确的写法如下:

1
2
3
SELECT  text,date_column  FROM  tbl
WHERE  date_column >= TO_DATE( '2014-01-01' , 'YYYY-MM-DD' )
AND  date_column < TO_DATE( '2015-01-01' , 'YYYY-MM-DD' );


2、查询出最近日期的一行数据

1
2
3
4
5
6
7
CREATE  INDEX  tbl_idx  ON  tbl (a,date_column);
SELECT  *
FROM (
SELECT  id,date_column  FROM  tbl  WHERE  a = :a
ORDER  BY  date_column  DESC
      )
WHERE  rownum <=1;

       这段SQL很经典,开发中很多地方都可能会用到类似这样的查询。没错,这段SQL是不需要优化的,它可以按照经过索引的 Top-N 查询方式执行,它的效率跟 INDEX UNIQUE SCAN(唯一索引扫描) 是等效的,所以会非常快。


3、两个查询语句,通过一个普通列查询:

1
2
3
4
5
6
7
8
9
10
11
CREATE  INDEX  tbl_idx  ON  tbl (a,b);
                                                                                                                                 
SELECT  id,a,b
FROM  tbl
WHERE  a = :a
AND  b= :b;
                                                                                                                                 
                                                                                                                                 
SELECT  id,a,b
FROM  tbl
WHERE  b = :b;

       这个很简单,只有第一个SQL用到了索引,而第二个却无法使用索引。其实这就是单索引与组合索引在使用上的区别。


4、字符串模糊查询

1
2
3
4
5
CREATE  INDEX  tbl_idx  ON  tbl (text);
                                                                   
SELECT  id,text
FROM  tbl
WHERE  text  LIKE  '%uncletoo%' ;

       在前面的文章中,我们曾经说过 like 语句如何使用通配符才能提高效率(8个SQL语句常用优化技巧)。当条件中遇到 like 语句,那么无论该字段是否设置索引效果都一样,因为索引遇到 like 就会无法发挥其效能,而且也没有更好的解决办法,因此建议大家除非万不得已,否则不要轻易使用 like 语句。


5、查询某条件下的记录数

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE  INDEX  tbl_idx  ON  tbl (a,date_column);
                                      
SELECT  date_column, count (*)
FROM  tbl
WHERE  a= :a
GROUP  BY  date_column;
                                      
                                      
SELECT  date_column, count (*)
FROM  tbl
WHERE  a= :a
AND  b = :b
GROUP  BY  date_column;

       上面两条查询语句,第一条可能会查出几千或者几万条记录,而第二条语句因为多了一个条件可能只查出几条或几十条记录,也许大家会认为第二条语句的效率更快。其实刚好相反,第一条语句的执行效率更快。因为第一条语句中,索引覆盖了所有查询字段,而第二个SQL中的b条件没有索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值