1、创建索引

  1. -- 索引种类
  2. -- 普通索引
  3. create index idx_emp_index_sal on emp_index(sal);
  4. -- 唯一索引
  5. create unique index uq_idx_emp_index_ename on emp_index(ename);
  6. -- 组合索引
  7. create index idx_emp_index_ename_job on emp_index(ename,job);
  8. -- 唯一组合索引
  9. create unique index idx_emp_index_empno_job on emp_index(empno,job);
  10. -- 位图索引
  11.  create bitmap index idx_emp_index_deptno on emp_index(deptno);
  12. -- 基于函数的索引
  13. create index idx_emp_index_comm on emp_index(nvl(comm,0));
  14. -- 删除索引
  15. drop index idx_emp_index_comm;
  16. -- 数据字典 查看表的索引
  17. select * from user_indexes where table_name = 'emp_index';

2、索引失效

  1. -- 索引失效
  2. -- 第一种情况 隐式转换导致索引失效
  3. -- 由于字段empno 的数据类型是 number 跟字符'7500'去比较
  4. select *
  5. from emp e
  6. where empno > '7500'
  7. -- 建表
  8. select * from emp_index;
  9. drop table emp_index;
  10. create table emp_index as select * from emp;
  11. -- 唯一组合索引
  12. create index idx_emp_index_empno_job_sal on emp_index(job,sal);
  13. -- 唯一索引
  14. create unique index uq_idx_emp_index_ename on emp_index(empno);
  15. -- 对索引列进行算数运算导致索引失效
  16. select *
  17. from emp_index e
  18. where empno + 100 > 7500
  19. -- 函数导致索引失效
  20. select *
  21. from emp_index e
  22. where substr(empno,3,2) > 50;
  23. -- 总结:对字段做处理就会导致索引失效 因为它已经不是原来的字段了
  24. -- 以下使用会使索引失效,应避免使用
  25. a. 使用 <> not in not exist、!=
  26. b. like "%_"
  27. c. 单独引用复合索引里非第一位置的索引列
  28. select * from emp_index order by job,sal;
  29. -- 这个sql是用不到索引的 取数条件只用到组合索引的第二个字段
  30. select *
  31. from emp_index e
  32. where e.sal > 2000;
  33. -- 取数条件只用到组合索引的第一个字段 可以用到索引
  34. select *
  35. from emp_index e
  36. where e.job = clerk;
  37. -- 取数条件用到组合索引的两个字段 可以用到索引
  38. select *
  39. from emp_index e
  40. where e.job = clerk
  41. and e.sal > 1500;
  42. -- 创建索引 表本身的数据是不会变的
  43. -- 可以看做有一张索引表 把索引字段与物理地址给保存起来 并排序
  44. select rowid,empno
  45. from emp_index
  46. order by empno;
  47. -- 取数的时候先去索引表里面找到对应的 rowid 再根据rowid去取对应的数据
  48. select *
  49. from emp_index e
  50. where e.empno > 7500;