当前位置: 首页 > news >正文

Oracle索引详解

索引

类似于书的目录,提高查询效率。

创建索引语法:

 CREATE [UNIQUE] [BITMAP] INDEX 索引名称 ON 表名(字段,[字段,..,..]);
 名词解释:
     UNIQUE 唯一索引
     BITMAP 位图索引
     默认不写 UNIQUE 和 BITMAP 为普通索引
     表名后面写多个字段为复合索引
     在字段加函数为函数索引
     
 注意:当给表中字段添加主键约束或唯一约束时会自动生成一个索引

示例1:创建主键约束和唯一约束

1)创建INDEX_TB

 CREATE TABLE INDEX_TB(
        ID NUMBER,
        NAME VARCHAR2(30),
        SEX CHAR(2),
        AGE NUMBER(3)
 );

2)给INDEX_TB表中添加数据

 BEGIN
   FOR V IN 1..10000 LOOP
     IF MOD(V,2) = 1 THEN
       INSERT INTO INDEX_TB VALUES(V,CHR(FLOOR(DBMS_RANDOM.value(45000,60000)))||CHR(FLOOR(DBMS_RANDOM.value(45000,60000))),'男',FLOOR(DBMS_RANDOM.value(18,100)));
     ELSE
       INSERT INTO INDEX_TB VALUES(V,CHR(FLOOR(DBMS_RANDOM.value(45000,60000)))||CHR(FLOOR(DBMS_RANDOM.value(45000,60000))),'女',FLOOR(DBMS_RANDOM.value(18,100)));      
     END IF;
   END LOOP;
 END;

3)给INDEX_TB表中的ID列添加主键

 alter TABLE index_tb add constraint pk_id primary key(ID);

当我给表中添加主键约束时,会发现表中已经有索引了。

4)删除INDEX_TB表中的主键约束,为其添加唯一约束

 alter table index_tb drop constraint PK_ID; -- 删除主键约束
 alter table index_tb add constraint unique_id unique(ID); -- 添加唯一约束

这个时候我们再次查看表就发现,表中已经默认生成索引了

示例2:创建普通索引

 CREATE INDEX PT_IND ON INDEX_TB(NAME);
 什么叫普通索引?
     任何列都可以创建        

示例3:创建唯一索引

 CREATE UNIQUE INDEX u_ind ON INDEX_TB(AGE);

如上图所示:

当我们需要给表中某个列添加唯一索引时,那么该列的值中不能出现重复值,否则添加失败;同理,当我们给某个列添加上唯一索引时,那么该列也会被添加上唯一约束,以后该列就不能在添加重复数据了。

示例4:创建位图索引

 CREATE BITMAP INDEX m_ind ON INDEX_TB(sex);

什么是位图索引?

位图索引适合建立在基数小的列,例如:性别、地区、婚姻状况等列。

示例5:创建复合索引

CREATE UNIQUE INDEX fh_ind ON INDEX_TB(id,name,sex);

注意:

在使用复合索引时一定要保证最左原则,也就是说当我在查询时,我where条件中没有id列,而是其他俩个列则索引失效。

验证:

EXPLAIN PLAN FOR
SELECT * FROM INDEX_TB WHERE SEX = '男';
SELECT * FROM TABLE(DBMS_XPLAN.display);

如上图所示,该语句并没有走我创建的复合索引(fh_ind),如果我将where条件换成id则不一样,测试如下显示:

EXPLAIN PLAN FOR
SELECT * FROM INDEX_TB WHERE ID = 888;
SELECT * FROM TABLE(DBMS_XPLAN.display);

示例6:函数索引

已知在示例2中我已经创建了普通索引,但是,不管什么索引,当我们在索引列上使用函数时,索引就会失效。测试如下:

EXPLAIN PLAN FOR
SELECT * FROM INDEX_TB WHERE ASCII(NAME) = 48615;
SELECT * FROM TABLE(DBMS_XPLAN.display);

如上图所示,我在示例2中为name列创建的普通索引pt_ind没有被使用。其原因是因为我在索引列上使用了函数。但是在实际工作中,我们有时候必须要使用函数,该怎么办呢?我们可以为其创建一个函数索引。如下:

CREATE INDEX HS_ind ON INDEX_TB(ASCII(NAME)); -- 为name列添加函数索引
-- 再次执行上一条代码
EXPLAIN PLAN FOR
SELECT * FROM INDEX_TB WHERE ASCII(NAME) = 48615;
SELECT * FROM TABLE(DBMS_XPLAN.display);

如上图所示,当我再次查看执行计划时,发现该语句在执行是使用了索引。

说白了,函数索引就是基于对表中列计算后的结果创建索引。

相关文章:

  • R语言ggplot2可视化:去除可视化结果中的NA图例、删除缺失值图例
  • java生成带logo的二维码
  • RK平台UVC摄像头shell测试脚本
  • Kafka 0.11.0.2 安装备忘录
  • Radxa Rock 3a NPU调用指南
  • Java 线程中断、线程让步、线程睡眠、线程合并
  • Java笔记15 - 面向对象
  • XSS脚本攻击防御(Antisamy)
  • Session的原理分析
  • 设计模式--单例模式(懒汉、饿汉)
  • 20个Java小项目,献给嗜学如狂的人,拿来练练手
  • GFS文件分布式系统概述与部署
  • zabbix监控基本概念和部署
  • 灵性图书馆:好书推荐-《情绪的惊人力量》
  • Google Earth Engine(GEE)——MODIS/061/MOD09GA影像计算NDVI并导出结果并UI可视化批量导出(含错误提示)
  • Google 是如何开发 Web 框架的
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • JavaScript 基础知识 - 入门篇(一)
  • Java比较器对数组,集合排序
  • java第三方包学习之lombok
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python 反序列化安全问题(二)
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • uva 10370 Above Average
  • 关于extract.autodesk.io的一些说明
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何进阶一名有竞争力的程序员?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习Vue.js的五个小例子
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (33)STM32——485实验笔记
  • (MATLAB)第五章-矩阵运算
  • (附源码)ssm码农论坛 毕业设计 231126
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (一)SpringBoot3---尚硅谷总结
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ./configure,make,make install的作用
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net FrameWork简介,数组,枚举
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET大文件上传知识整理
  • .net快速开发框架源码分享
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .net项目IIS、VS 附加进程调试
  • /boot 内存空间不够
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [Android] Android ActivityManager
  • [Android]使用Retrofit进行网络请求
  • [bzoj1324]Exca王者之剑_最小割