分区表查询--条件查询--部分时间区间数据查询不出来--但是数据库有数据

【发现问题场景|背景】:
测试对比分区表非分区表时间区间查询效率
【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执行计划日志,时间区间内实际是有数据的

1 个赞

ADMIN CHECK TABLE table_name;
执行下看下分区表的表和索引是否数据不一致?

1 个赞

看下统计信息数据,是不是不正确

1 个赞

重新收集一下系统信息,检查一下索引看看是不是失效了

2026-09-31 不是正确的日期, 应该是2026-09-30

2026-11-31 23:59:59不是合法的日期吧

1 个赞

analyze table看下

建议执行ADMIN CHECK TABLE 检查一下是否一致。

楼主发的截图里已经analyze table过了。

建议执行ADMIN CHECK TABLE 检查一下是否一致。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。