基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库 V3.x 版本中全局索引回表不保证记录顺序与索引一致
更新时间:2026-05-22 08:56
在 OceanBase 数据库 V4.2.3 版本之前,全局索引回表(分区表)不能保证记录顺序与全局索引一致。当查询需要对数据按照全局索引的键值进行排序时,全局索引回表的路径无法避免排序。
详细信息
分区表 tb_xx 上有全局索引在字段 gmt_modified 上,详细 DDL 如下所示。
CREATE TABLE `tb_xx` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ONUPDATECURRENT_TIMESTAMP COMMENT '修改时间',
`data_version` bigint(20) NOT NULL DEFAULT '0' COMMENT '数据版本',
`is_delete` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除,0-否,1-是',
`promise_id` varchar(64) NOT NULL COMMENT '履约id',
`order_id` varchar(64) NOT NULL COMMENT '订单id',
`consumer_id` varchar(64) NOT NULL COMMENT '主体id,比如店铺id',
`sku_id` varchar(64) NOT NULL COMMENT '产品skuId',
`spu_id` varchar(64) NOT NULL COMMENT '产品spuId',
`buy_id` varchar(64) NOT NULL COMMENT '购买人id:比如店铺ownerId,amap_uid',
`is_reverse` int(10) NOT NULL DEFAULT '1' COMMENT '1:正向;2:逆向',
KEY `idx_gmt_modified` (`gmt_modified`) BLOCK_SIZE 16384 GLOBAL,
KEY `uk_promise_id` (`promise_id`) BLOCK_SIZE 16384 LOCAL
) AUTO_INCREMENT = 2890001 DEFAULT CHARSET = utf8mb4 partition by key(promise_id)(
partition p0,
partition p1,
partition p2,
partition p3,
............
partition p63);
如下 SQL 查询 tb_xx 表,从中获取按照 gmt_modified 字段排序的前 10 条记录,explain 显示执行计划为全表扫描+排序,不使用全局索引 idx_gmt_modified。
MySQL > explain SELECT * FROM tb_xx WHERE 1=1 ORDER BY gmt_modified desc limit 0,10;
输出内容如下:
| Query Plan
| ==========================================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
----------------------------------------------------------
|0 |LIMIT | |10 |481641|
|1 | PX COORDINATOR MERGE SORT | |10 |481641|
|2 | EXCHANGE OUT DISTR |:EX10000|10 |481627|
|3 | LIMIT | |10 |481627|
|4 | TOP-N SORT | |10 |481627|
|5 | PX PARTITION ITERATOR | |875052 |346132|
|6 | TABLE SCAN |tb_xx |875052 |346132|
==========================================================
如果使用全局索引 idx_gmt_modified,还需要回表,回表后不能保证结果按照 gmt_modified desc 排序,还需要额外的 Sort 处理。OceanBase 在计算执行计划代价时,发现使用全局索引回表 + Sort 的代价比直接使用 Table Scan + Sort 的代价还高,因此优化器选择了 Table Scan 。
适用版本
OceanBase 数据库 V4.2.3 之前版本。