一、工作心得:优化也好,升级也罢,做web开发,安全重于泰山。只有数据安全了,才可以谈优化。

二、关于索引

Oracle B-tree、位图、全文索引三大索引性能比较及优缺点罗列一下

1、B-Tree索引

场合:非常适合数据重复度低的字段 例如 身份证号码  手机号码  QQ号等字段,常用于主键 唯一约束,一般在在线交易的项目中用到的多些。

原理:一个键值对应一行(rowid)  格式: 【索引头|键值|rowid】

优点:当没有索引的时候,oracle只能全表扫描where qq=40354446 这个条件那么这样是灰常灰常耗时的,当数据量很大的时候简直会让人崩溃,那么有个B-tree索引我们就像翻书目录一样,直接定位rowid立刻就找到了我们想要的数据,实质减少了I/O操作就提高速度,它有一个显著特点查询性能与表中数据量无关,例如 查2万行的数据用了3 consistent get,当查询1200万行的数据时才用了4 consistent gets。

当我们的字段中使用了主键or唯一约束时,不用想直接可以用B-tree索引

缺点:不适合键值重复率较高的字段上使用

2、位图索引   Bitmap index
场合:列的基数很少,可枚举,重复值很多,数据不会被经常更新
原理:一个键值对应很多行(rowid), 格式:键值  start_rowid   end_rowid  位图
优点:OLAP 例如报表类数据库 重复率高的数据 特定类型的查询例如count、or、and等逻辑操作因为只需要进行位运算即可得到我们需要的结果
缺点:不适合重复率低的字段,还有经常DML操作(insert,update,delete),因为位图索引的锁代价极高,修改一个位图索引段影响整个位图段,例如修改
一个键值,会影响同键值的多行,所以对于OLTP 系统位图索引基本上是不适用的

3、全文索引 Text index
定义:全文索引就是通过将文字按照某种语言进行词汇拆分,重新将数据组合存储,来达到快速检索的目的
场合:当字段里存储的都是文本时适合用全文索引,常用于搜索文字
优点:全文索引不是按照键值存储的,而是按照分词重组数据,常用于模糊查询Where name like '%leonarding%'效率比全表扫描高很多,适用OLAP系统,
OLTP系统里面用到的并不多。
缺点:全文索引会占用大量空间有时比原表本身占的空间还多,bug较多,维护困难。

4、之前整理的笔记:

sql语句中用来实现模糊查询,可以在where了句中使用like来达到模糊查询的效果。
可以使用两个通配符: % 零个或多个字符 _ 单一任何字符(下划线) ------------------------------where a.upload_path like '%电子版档案_';筛选含有电子版档案的数据

SQL> select * from emp2 where job like '%RE%' and ename like '%A%' and mgr like '%3%';
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
Executed in 1.859 seconds

如上所示,LIKE查询一次,就走一次全表扫描,效率非常慢

同样的效果,现在来换做INSTR函数来执行

SQL> select * from emp where instr(job,'RE')>0 and instr(ename,'A')>0 and instr(mgr,'3')>0;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
Executed in 0.063 seconds

看到了吧,,时间上的差异很明显,INSTR在一瞬间执行完成,因为这个是查找的字段,而非走全表扫描

看来,oracle 内部函数效率还是高些。

因此,大家以后碰到同样的问题,除了全文检索外,这个也是个好方式

注意:

    select   id, name from users where instr(id, '101') > 0;  

         等价于

          select   id, name from users where id like '%101%'

 

于德晓测试结果:

select * from gt_alarm where alarm_date like '%2016/4/3%'; --11sselect * from gt_alarm where instr(alarm_date,'2016/4/3')>0; --9s
select * from gt_alarm where alarm_person like '%xiuxianxi%';--11s
select * from gt_alarm where instr(alarm_person,'xiuxianxi')>0;--8s

通过结果,管中窥豹,可见一斑。