首批通过分布式安全可靠测评,为关键业务系统打造
INT 类型字段传入 DOUBLE 类型数据,导致全表扫描
更新时间:2025-09-11 06:31
问题现象
一条简单的查询 SQL,执行时间超过 60s,SQL如下:
obclient SELECT * FROM histories WHERE id = ? ORDER BY created_at ASC, id ASC LIMIT ?;
建表语句如下:
CREATE TABLE `histories` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`history_type` int(11) DEFAULT NULL,
`user_id` varchar(255) DEFAULT NULL,
`content` longtext DEFAULT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON
UPDATE
CURRENT_TIMESTAMP,
`file_guid` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `histories_file_guid_keys` (`file_guid`) BLOCK_SIZE 16384 LOCAL,
KEY `idx_histories_file_guid_keys` (`file_guid`, `history_type`, `updated_at`) BLOCK_SIZE 16384 LOCAL
);
id 字段为主键,查询 SQL 属于点查,正常情况不应该会出现全表扫描。
问题原因
经过对日志进行排查,发现应用在传参时,id 字段传入的是 double 类型,具体日志如下:

影响版本
OceanBase 数据库 4.2.4 之前版本。
解决方法
根本解决方法:
升级 OceanBase 数据库版本至 V4.2.4 和 V4.3.5 及以上版本。
临时解决方法:
修改传入参数的类型。