Oracle 支持哪些索引类型?

典型回答 Oracle 比MySQL 在索引上的支持更加全面,在数据结构上,主要包括了 B+树索引、位图索引、R 树索引以及 Quad 树索引。 B+树索引(重要) 这个大家都不陌生,在 MySQL 中主要用的就是这个索引。 (很多人说Oracle用的是B树索引,这么说是不对的,虽然Oracle官网也说是B-Tree,但是实际上还是B+树。详见下面这篇文章。) ✅Oracle为什么用B-树索引? 使用B+树实现索引,有以下几个优点: 支持范围查询,B+树在进行范围查找时,只需要从根节点一直遍历到叶子节点,因为数据都存储在叶子节点上,而且叶子节点之间有指针连接,可以很方便地进行范围查找。 支持排序,B+树的叶子节点按照关键字顺序存储,可以快速支持排序操作,提高排序效率; 有利于磁盘预读。由于B+树的节点大小是固定的,因此可以很好地利用磁盘预读特性,一次性读取多个节点到内存中,这样可以减少IO操作次数,提高查询效率。 有利于缓存。B+树的非叶子节点只存储指向子节点的指针,而不存储数据,这样可以使得缓存能够容纳更多的索引数据,从而提高缓存的命中率,加快查询速度。 位图索引(重要) 位图索引使用一系列bit来表示数据记录是否存在。 ✅什么是BitMap?有什么用? bitmap 索引将每个被索引的列的值作为 KEY,使用每个 bit 表示一行,当这行中包含这个值时,设置为 1,否则设置为 0。 如下图: 按照性别来看,编号从0到4分别是 M F F M F ,那么如果 M 作为索引的 key的话,那么他的结果就是 1 0 0 1 0,而 F 的结果结果就是0 1 1 0 1。 位图索引和 B+树索引刚好相反,他比较适合建立在重复度比较高的字段上,比如上面的性别字段,这样只需要两个 bitmap 就可以完成存储了。 同时,位图索引适合于那种变化不频繁的数据,比如上面的性别字段(哈哈哈哈哈。。。。)。而对于经常变化的字段,不适合用位图索引。 在创建索引时,指定CREATE BITMAP INDEX就是创建位图索引了。 1 CREATE BITMAP INDEX index_name ON table_name (column_name); R树索引(了解即可) Oracle 中一个专为存储、管理和检索位置数据设计的高级功能,它支持多种空间数据类型和相关操作,这就是Spatial。 ...

March 22, 2026 · 1 min · santu

Oracle为什么用B-树索引?

典型回答 :::danger 先问是不是,再问为什么!!! Oracle的索引是B-树索引吗?(ps:B-树索引是通过B-tree翻译过来的,不要读成"B减树",直接读成"B树"才对) 不是! 那Oracle是什么索引? 其实是B+树! 那为什么很多人说是B-树? 因为Oracle官方也是这么说的。 ::: 然后继续一点一点讲。先搞清楚B树和B+树有啥区别。 ✅什么是B+树,和B树有什么区别? 主要有以下2个区别: 数据存储位置:在B树中,数据项存储在叶子节点和非叶子节点上,而在B+树中,数据项只存储在叶子节点上。非叶子节点只包含键值信息。 叶子节点指针:B树的叶子节点之间没有指针连接,每个叶子节点独立存储数据项。而B+树的叶子节点通过指针连接成一个链表,可以方便地进行范围查询。 那么,接着看,Oracle的索引到底长啥样。 以下是Oracle官方给出的他的索引的结构,原文链接我也贴在下面了。 https://docs.oracle.com/en/database/oracle/oracle-database/23/cncpt/indexes-and-index-organized-tables.html#GUID-FC93A85B-C237-4249-AD1E-FF54576ED050 可以看到,他的非叶子节点上,只有索引的值(和指针),而在叶子结点上有索引值和rowid。符合B+树只有叶子结点存储数据的特点。 其次,叶子结点之间是有双向指针链接的,这也是B+树的特征。 所以,这就是一棵B+树。 为啥广为传播的说Oracle使用的是B树呢?因为他官网自己说的: 那他说错了么? 其实也没错,因为"B-tree" 常常被用作一个广义的术语,涵盖了B树及其变体(如B+树)。所以在Oracle早期文档中就是这么叫的,所以这种命名方式也一直延续下来了。

March 22, 2026 · 1 min · santu

什么是视图,视图的作用是什么?

典型回答 所谓视图,其实就是一个数据快照,他并不是一个物理的存储,而是一个逻辑表。它是基于一个或多个实际表或其他视图的查询结果集。 举个例子,比如我的表中有各种业务的数据,他们彼此之间是通过租户 ID 进行逻辑隔离的,但是当我们在做数据分析或者报表的时候,需要给某个租户提供一些数据,这时候就可以做个视图,把只属于他的数据给他看,不属于他的数据就不包含在这个视图中,他就看不到。 通过上面的例子就能知道,视图有这么几个好处: 数据安全:通过视图可以限制用户对表中全量数据的访问,用户只能看到视图中定义的数据,而不能直接访问或修改基础表中的数据。这可以增强数据安全性。 数据独立性:视图可以提供与底层表结构无关的数据接口,如果基础表结构发生变化,只需要修改视图定义,而不需要更改使用视图的应用程序。 创建视图使用 CREATE VIEW 语句: 1 2 3 4 CREATE VIEW emp_dept_view AS SELECT e.employee_id, e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id; 查询视图就和查询普通表一样: 1 SELECT * FROM emp_dept_view; 其实,视图不仅仅 Oracle 中支持,MySQL 也是支持的,但是一般在 MySQL 用的比较少而已,主要是因为他并不是完美无缺的,他还有一些问题的,比如: 性能问题: 视图是基于查询的逻辑表,每次访问视图时都会执行其定义的查询。如果视图包含复杂的查询或涉及大量数据,可能会影响性能。 更新限制: 并非所有视图都可以更新。对于包含聚合函数、复杂联接、子查询等的视图,通常无法直接进行插入、更新或删除操作。 调试和维护复杂: 由于视图是基于查询的抽象层,调试和优化视图可能比直接操作基础表更加复杂。 如果视图定义过于复杂或依赖多个其他视图或表,维护起来也会更加困难。

March 22, 2026 · 1 min · santu

Oracle 和 MySQL 的区别是什么?如何选择?

典型回答 Oracle是一个企业级数据库系统,支持大规模应用、高并发和高可用性。它具有复杂的架构,支持多租户、多实例以及丰富的特性,如高级备份和恢复、安全管理、分布式数据库、数据仓库、物化视图等。 因为是收费的,所以Oracle在性能优化、负载均衡和集群技术方面有很强的能力。支持RAC(Real Application Clusters)等技术,可以实现高可用性和可扩展性。 还是因为收费,所以Oracle有完善的商业支持和服务体系,提供全球性的技术支持和咨询服务,适合大企业的复杂业务需求。 MySQL是一个开源的数据库系统,通常用于中小型应用或作为Web应用的后端数据库。它的架构相对简单,易于部署和管理。MySQL更注重读操作性能,适合高读取量的应用。 因为是开源的,所以 MySQL 相比 Oracle有更广泛的社区支持,也有企业版提供商业支持,但其支持服务肯定是不如 Oracle的。 另外,一些其他的区别如下(每一个具体的内容我们会在其他文章中展开): **** Oracle MySQL 定位 企业级数据库 开源数据库 默认事务隔离级别 RC RR 执行引擎 只有一种引擎 支持多种存储引擎 SQL语法 支持 PL/SQL,支持存储过程、触发器等 支持标准 SQL 事务提交 默认不自动提交,需要手动提交 默认自动提交 主键 序列号 auto increment 分页 ROWNUM 或者 ROW_NUMBER() limit 索引 B+ 树、位图、反向键、函数索引、域索引 B+树、全文、哈希索引 数据恢复 RAC 主从复制 字符串连接 ` 其他 … …

March 22, 2026 · 1 min · santu

阿里巴巴的去 IOE架构中为什么废弃 Oracle

典型回答 去 IOE,是阿里巴巴造出的概念。其本意是,在阿里巴巴的IT架构中,去掉IBM的小型机、Oracle数据库、EMC存储设备,取而代之的是自己在开源软件基础上开发的系统。如 MySQL 代替 Oracle。 为什么要放弃 Oracle 而采用 MySQL 呢 ,主要有以下这些考量: 成本 最重要的一个原因就是成本了,因为Oracle 的数据库软件和相关服务的费用是非常高的。对于像阿里巴巴这样的大型互联网公司,需要处理海量的数据和大量的数据库实例,使用 Oracle 可能会导致非常高的许可和维护成本。 而采用开源数据库(如 MySQL 和 PostgreSQL)和自主研发的解决方案,可以大幅降低数据库相关的成本。 可扩展性 阿里巴巴需要处理非常大规模的数据和高并发的访问。传统的 Oracle 数据库架构在扩展性和高并发处理上有一定的局限性。 阿里巴巴有很强的技术能力,完全可以基于开源的数据库进行改造,或者使用分布式数据库架构和自主研发的数据库系统,可以更好地支持其业务的高速增长和扩展需求。 灵活性与自主性 干掉 Oracle,可以使得大厂在数据库技术上拥有更多的自主权和灵活性。使用 Oracle 的闭源商业软件,阿里巴巴在技术演进和创新上受到了一定的限制。通过转向开源数据库和自主研发,阿里巴巴可以更好地掌控技术路线和创新方向,并且能够根据自身需求进行定制和优化。

March 22, 2026 · 1 min · santu

Oracle 的事务隔离级别?

典型回答 我们都知道,数据库是是支持多个事务同时执行的,而这些同时执行的事务能不能看到别的事务更高的数据呢?能看到哪些数据?这就是事务隔离级别来规定的。 所谓事务隔离级别,是数据库管理系统(DBMS)中用于定义事务处理过程中不同事务之间可见性和相互影响程度的一套标准。 事务隔离级别的主要目的是平衡数据的一致性和系统的并发性,一般来说更高的隔离级别虽然能提高数据的一致性,但同时也可能降低系统的并发能力。 在我们常用的 MySQL 中,支持可串行化(Serializable)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)这四种隔离级别。而 Oracle ,只支持提交读(Read committed)和**可串行化(Serializable),以及他自己定义的只读(Read Only)** 可读提交(Read Committed) RC是Oracle的默认事务隔离级别。在此级别下,一个事务只能看到其他事务已经提交的更改。 这意味着,每次查询只能看到查询开始时已经提交的数据。这种隔离级别有效地防止了“脏读”,但无法防止“不可重复读”和“幻读” ✅什么是脏读、幻读、不可重复读? 可串行化(Serializable) 这是一种非常严格的隔离级别,在此隔离级别下,事务将看到一致性的数据库快照,该快照从事务开始时刻起就不再改变。 这个级别可以防止脏读、不可重复读和幻读。 在Oracle中,可以使用ALTER SESSION命令来设置会话的隔离级别。例如,设置会话为可串行化: 1 ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE; 只读(Read Only) 在只读隔离级别下,事务看到的是在事务开始时刻数据库的一个静态快照。该级别的事务不能执行任何更新操作(即DML语句如INSERT, UPDATE, DELETE),只能执行查询操作。 这个隔离级别同样可以防止脏读、不可重复读和幻读(只有读,没有写了,啥问题都没有了)。它适用于需要执行长时间运行的查询而不影响其他事务的场景。

March 22, 2026 · 1 min · santu

什么是反向键索引,有什么用处?

典型回答 ✅MySQL中like的模糊查询如何优化 我们在上面的文章中讲过一种优化MySQL 中 like查询的方案,那就是将列反转然后存储并创建索引。 而 Oracle 中已经支持了一种反向键索引的方式。加入一个字段的值为"hollis_chuang",那么反向键索引就是以反转后的值作为索引的 key,即"gnauhc_silloh"。 反向键索引的主要好处就是可以优化 like 的查询性能,like “%hollis_chuang” 可以被优化成"gnauhc_silloh%",这样就可以利用最左前缀匹配进行索引精确查询了。 反向键索引还有一个好处,那就是通过反转键值的顺序,从而分散了插入点,减少了热点问题。假设有一个顺序增加的键,如1001, 1002, 1003等。在标准的B-树索引中,这些键将连续存储,可能导致特定部分的数据库页过于频繁地更新。如果使用反向键索引,则变成1001,2001和3001,这样存储的位置就更加分散一些。 在高并发插入的环境中,如热点的秒杀场景,会有非常频繁的数据插入,并且插入的数据都是连续的,那么就会出现热点块,而使用反向键索引就可以减少由于插入操作引起的I/O热点。 创建反向键索引的SQL命令如下: 1 CREATE INDEX my_reverse_index ON my_table(my_column) REVERSE; 但是需要注意的是,反向键索引不适合范围查询,因为键值的字节序反转后,原本连续的数值可能在物理存储上变得不连续。所以,用起来要慎重!

March 22, 2026 · 1 min · santu

介绍下函数索引、位图索引、空间索引?

典型回答 函数索引基于表中一列或多列的函数结果创建的索引。好处就是可以解决用了函数之后索引就失效了的问题。 这个功能在 MySQL 中也支持,只不过在8.0之后,相关原理一样的: ✅MySQL用了函数一定会索引失效吗? 位图索引使用一系列bit来表示数据记录是否存在。bitmap 索引将每个被索引的列的值作为 KEY,使用每个 bit 表示一行,当这行中包含这个值时,设置为 1,否则设置为 0。 详见: ✅Oracle 支持哪些索引类型? **空间索引,**是专门用于索引地理空间数据,如使用SDO_GEOMETRY类型的数据。如我们介绍过的 R 树索引和四叉树索引都是空间索引 ✅Oracle 支持哪些索引类型?

March 22, 2026 · 1 min · santu

Oracle中如何实现行转列和列转行?

典型回答 在Oracle中,有专门的函数实现了行转列和列转行的功能,分别是pivot和unpivot函数。 **PIVOT**** 用于将行数据转换为列数据**。通常应用在需要对数据进行聚合(如求和、计数等)并将某一列的不同值转化为列名的情况。 假设有一个表 sales,结构如下: year product sales 2020 A 100 2020 B 200 2021 A 150 2021 B 300 我们希望将 product 列中的值(A 和 B)转换为列,得到以下格式: year A B 2020 100 200 2021 150 300 在 Oracle 中,PIVOT 操作的实现如下: 1 2 3 4 5 6 SELECT * FROM sales PIVOT ( SUM(sales) FOR product IN ('A' AS A, 'B' AS B) ) ORDER BY year; **UNPIVOT**** 用于将列数据转换为行数据。**通常用于将表中的列名转换成行数据,以便对数据进行进一步分析。 假设有一个表 sales_data,结构如下: ...

March 22, 2026 · 1 min · santu

PL_SQL 是什么,为什么使用 PL_SQL 而不是 SQL?

PL/SQL(Procedural Language/SQL)是 Oracle 提供的一种过程化编程语言,它结合了 SQL 的数据操作功能和过程化语言的控制结构。PL/SQL 可以用来编写复杂的数据库操作,提供了更高效的数据库程序设计和更强的控制能力。 虽然 SQL 是数据库交互的标准语言,PL/SQL 也在很多情况下比 SQL 更有优势。以下是一些常见的使用 PL/SQL 的原因以及对应的实例: 更强的逻辑控制能力 SQL 是一种声明式语言,它通过声明查询或数据操作来告诉数据库该做什么,而没有内建的流程控制功能。对于需要复杂逻辑的任务,SQL 很难满足需求。而 PL/SQL 提供了过程化的结构,如 **IF**、**LOOP**、**FOR**** 循环、**WHILE** 循环、异常处理等,这使得开发者能够编写具有更复杂业务逻辑的程序。** 举个例子: 如果你想检查某个条件,如果满足则执行特定操作,否则执行另一个操作,使用纯 SQL 语句比较困难,而在 PL/SQL 中可以非常轻松地使用 IF-THEN-ELSE 来实现。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DECLARE v_salary employees.salary%TYPE; BEGIN -- 获取员工 1001 的薪水 SELECT salary INTO v_salary FROM employees WHERE employee_id = 1001; -- 根据薪水条件执行操作 IF v_salary > 5000 THEN UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 1001; DBMS_OUTPUT.PUT_LINE('Salary updated'); ELSE DBMS_OUTPUT.PUT_LINE('Salary too low for increase'); END IF; END; 批量操作与性能优化 使用 SQL 只能一次性处理一行数据或多个独立的 SQL 语句。如果你需要对大量数据进行处理,频繁地发出多次 SQL 请求会造成较高的开销,导致性能瓶颈。 ...

March 22, 2026 · 2 min · santu

留言给博主