索引——快速全局扫描

   快速全局扫描(Fast Full Scan)这一选项允许Oracle执行一个全索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。这个索引可以按顺序读取,这样可以一次读取多个块。初始化参数文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取得块的数目。

    如果表的查询中的所有列都被包含在索引中,而索引的前导列并不在WHERE条件中时,就可以使用快速全局扫描。

 

实验验证:

 

SQL> explain plan for select * from empt where deptno=20;

 

已解释。

 

SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------

 

Plan hash value: 1497070856

 

--------------------------------------------------------------------------

| Id | Operation        | Name | Rows | Bytes | Cost (%CPU)| Time    |

--------------------------------------------------------------------------

|  0 | SELECT STATEMENT |     |    1 |   37 |    3  (0)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| EMPT |    1 |   37 |    3  (0)| 00:00:01 |

--------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------

 

 

  1 - filter("DEPTNO"=20)

 

已选择13行。

 

SQL> explain plan for select empno,ename,deptno from empt where deptno=20;

 

已解释。

 

SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

Plan hash value: 161062661

 

-----------------------------------------------------------------------------

| Id | Operation       | Name    | Rows | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|  0 | SELECT STATEMENT |         |    1 |   33 |    1  (0)| 00:00:01 |

|* 1 | INDEX FULL SCAN| EMPT_ID1 |    1 |   33 |    1  (0)| 00:00:01 |

-----------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

 

  1 - access("DEPTNO"=20)

      filter("DEPTNO"=20)

 

已选择14行。

 

    由于SQL语句中的所有列都包含在索引中并且表经过了分析,这样就可以执行快速全局扫描。

 

注意:如果索引相对于表的总体大小来说很小,快速全局扫描可使程序的性能陡增。如果表中有一个包含了大部分列的组合索引,索引可能要比真实的表要大,这样快速全局扫描反而会降低性能。


<think>嗯,用户这次问的是MySQL是否存在全局索引,看来对数据库优化很感兴趣啊。从引用内容看,ta可能已经接触过分区表索引的概念,但被不同数据库的术语搞混了。引用[3]明确说MySQL分区表只支持本地索引,这和OceanBase的全局索引(引用[2])是两种东西。 用户引用的资料有点杂,既有索引失效的例子(引用[1][4]),又有其他数据库的概念。需要帮ta理清重点:MySQL自身的全局索引不存在,但分区表的索引策略值得深挖。ta可能实际想知道“如何实现跨分区高效查询”,这才是痛点。 上次回答时我提到过MySQL分区索引的本地性,这次要更强调原理——为什么MySQL不做全局索引?可以结合存储引擎特性解释:MyISAM时代连分区都不支持,InnoDB的分区实际是物理子表,自然延续了本地索引的设计。不过用户不需要太底层,重点给替代方案。 安全提示:必须明确区分“全局索引”在不同数据库中的含义,避免用户误以为OceanBase的GLOBAL关键字适用于MySQL。引用[2][3]的对比很关键。 </think>根据现有权威资料,MySQL **不支持全局索引(Global Index)**,其分区表仅提供**本地索引(Local Index)** 方案。以下是关键分析: ### 1. **MySQL索引的分区特性** - **本地索引(默认方案)**: 每个分区维护独立的索引结构,索引仅覆盖当前分区的数据。查询时可能需扫描多个分区的索引,例如: ```sql CREATE TABLE sales (...) PARTITION BY RANGE(year) (...); CREATE INDEX idx_amount ON sales(amount); -- 本地索引(自动关联分区) ``` 此索引会按分区规则拆分为多个子索引,`WHERE amount > 1000` 可能触发所有分区的索引扫描[^3]。 - **全局索引的缺失**: MySQL未实现跨分区的单一索引结构。若需跨分区检索,优化器可能退化为全表扫描或全分区扫描。 ### 2. **与OceanBase的对比** OceanBase等分布式数据库支持全局索引(如引用[2]所述),允许索引独立分区: ```sql CREATE INDEX g_idx ON orders(customer_id) GLOBAL; -- OceanBase语法(非MySQL) ``` 而MySQL无`GLOBAL`关键字,仅支持本地索引[^2][^3]。 ### 3. **性能影响示例** 当查询条件无法有效过滤分区时,本地索引可能效率低下: ```sql EXPLAIN SELECT * FROM tb_user WHERE phone >= '17799990015'; ``` 若`phone`字段非分区键,即使存在索引,也可能因跨分区访问导致优化器放弃使用索引(引用[1][^4])。 ### 4. **替代优化方案** - **分区键设计**:将高频查询字段(如`phone`)设为分区键,利用分区剪裁(Partition Pruning)。 - **联合索引优化**:避免范围查询导致索引失效(引用[4]): ```sql CREATE INDEX idx_phone_name ON tb_user(phone, name); -- 等值查询优于范围查询 ``` --- **总结**: ✅ MySQL仅支持**本地索引**,无全局索引功能。 ✅ 跨分区查询需依赖分区键设计或避免范围查询导致的索引失效。 ✅ 全局索引特性需选用OceanBase等分布式数据库实现[^2][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值