【发现问题场景|背景】:
测试对比分区表和非分区表时间区间查询效率
【TiDB 使用环境】-- 测试环境
【TiDB 版本】8.0.11-TiDB-v8.5.1
【操作系统】debain
Operating System: Debian GNU/Linux 12 (bookworm)
Kernel: Linux 6.1.0-18-amd64
Architecture: x86-64
【部署方式】
本地机房部署
【集群数据量】
测试环境 – 单表模拟生成 1.6亿
【集群节点数】
PD TiDB TiKV [4,4,4]
【问题复现路径】
1:创建 两个相同的表:
CREATE TABLE `x_test_order` (
`order_num` bigint NOT NULL COMMENT '单号',
`a` bigint DEFAULT NULL COMMENT 'xx1',
`b` bigint DEFAULT NULL COMMENT 'xx2',
`c` bigint DEFAULT NULL COMMENT 'xxx',
...
`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '交易创建时间',
PRIMARY KEY (`order_num`) /*T![clustered_index] CLUSTERED */,
KEY `idx_xxxx_ac` (`a`,`c`),
KEY `idx_xxxx_bc` (`b`,`c`),
KEY `idx_xxxx_gmt_create` (`gmt_create`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='xxx测试表';
CREATE TABLE `x_test_order_p` (
`order_num` bigint NOT NULL COMMENT '订单号',
`a` bigint DEFAULT NULL COMMENT 'xx1',
`b` bigint DEFAULT NULL COMMENT 'xx2',
`c` bigint DEFAULT NULL COMMENT 'xxx',
...
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '交易创建时间',
PRIMARY KEY (`order_num`,`gmt_create`) /*T![clustered_index] CLUSTERED */,
UNIQUE KEY `uq_idx_xxx_order_num` (`order_num`) /*T![global_index] GLOBAL */,
KEY `idx_xxxx_ac` (`a`,`c`),
KEY `idx_xxxx_bc` (`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='分区表测试'
PARTITION BY RANGE COLUMNS(`gmt_create`)
INTERVAL (3 MONTH)
FIRST PARTITION LESS THAN ('2026-01-01 00:00:00')
LAST PARTITION LESS THAN ('2051-01-01 00:00:00');
2:模拟2亿左右的数据
3:写查询sql – 工具 navicat –
-- 分区表代时间区间的查询
EXPLAIN
SELECT * from x_test_order_p
where gmt_create >= '2026-07-21 23:59:59' and gmt_create <= '2026-09-31 23:59:59'
ORDER BY order_num LIMIT 20
-- 非分区表查询
SELECT * from u_user_pay_order
where gmt_create >= '2026-07-11 23:59:59' and gmt_create <= '2026-09-31 23:59:59'
ORDER BY order_num LIMIT 20
4,:当时在看indexMerge的东西 ,在sql中加了如下注释,在当前查询中, 实际没啥用,只是拿来实验,观察现象用
/*+ USE_INDEX_MERGE(xxx,xxx) */
【遇到的问题:问题现象及影响】
分区表查询某些时间区间查不出来数据,但是有数据
* 查询结果及现象 : 查询条件,观察数据
* [where gmt_create >= ‘2026-07-21 23:59:59’ and gmt_create <= ‘2026-12-31 23:59:59’ ]
* 执行计划
-
查询条件更改:没数据了,但是根据第一个查询,区间内是有数据的
-
[where gmt_create >= ‘2026-07-21 23:59:59’ and gmt_create <= ‘2026-11-31 23:59:59’ ]
* 执行计划
-
再次更改查询条件:发现又能查询处理数据了
-
[where gmt_create >= ‘2026-07-21 23:59:59’ and gmt_create <= ‘2026-10-31 23:59:59’]
-
执行计划
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】
重新统计
指定分区进行统计
dashboard执行计划日志,时间区间内实际是有数据的









