执行计划不准

麻烦参考这个文档导出一下统计信息
https://docs.pingcap.com/zh/tidb/stable/statistics#导出统计信息

统计信息 (2.8 MB)

谢谢,正在分析

麻烦 test 表结构给一下

CREATE TABLE test (
id bigint(20) NOT NULL COMMENT ‘主键’,
bill_no varchar(50) COLLATE utf8mb4_general_ci NOT NULL ,
player_id varchar(20) COLLATE utf8mb4_general_ci NOT NULL ,
platform varchar(10) COLLATE utf8mb4_general_ci NOT NULL ,
game_type int(2) NOT NULL ,
currency_type varchar(10) COLLATE utf8mb4_general_ci NOT NULL ,
game_code varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL ,
game_name varchar(80) COLLATE utf8mb4_general_ci DEFAULT NULL ,
bet_number decimal(18,2) NOT NULL ,
valid_bet_number decimal(18,2) NOT NULL ,
net_number decimal(18,2) NOT NULL ,
dml decimal(18,2) NOT NULL ,
flag tinyint(1) NOT NULL DEFAULT ‘1’,
expand_str varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
bet_time datetime DEFAULT NULL ,
beijing_time datetime DEFAULT NULL ,
create_time datetime DEFAULT NULL ,
update_time datetime DEFAULT NULL,
tax decimal(18,2) DEFAULT NULL,
PRIMARY KEY (id),
KEY bet_time_index (bet_time),
KEY ims_game_record01_beijing_time_index (beijing_time),
KEY create_time_index (create_time),
KEY update_time_index (update_time),
KEY idx_player_id (player_id,platform),
UNIQUE KEY uidx_platform (platform,game_type,bill_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

我理解的,这个表里面没有数据,那么 estrows 估算出来的数据并没有太大的数量级的差异。您这面有用大量数据测试过吗?或者您觉得这个执行计划哪里有问题?

因为这个表是线上的,之前有很多数据,然后我删除了。之后我看执行计划还是扫250多行数据,就有点不理解。

是的,按我的理解,估算里面扫描 0 行和 250 行应该是一个数量级的。
扫描获取 1 行的代价和 获取 250 行的代价应该是一个数量级的。
这种估算出来的数量级都是 250。
mysql> explain select id, c1, c2 from t1 where c1 > 100 and c1 < 1000000;
±------------------------------±--------±----------±---------------------------±----------------------------------------------------+
| id | estRows | task | access object | operator info |
±------------------------------±--------±----------±---------------------------±----------------------------------------------------+
| IndexLookUp_10 | 250.00 | root | | |
| ├─IndexRangeScan_8(Build) | 250.00 | cop[tikv] | table:t1, index:ind_c1(c1) | range:(100,1000000), keep order:false, stats:pseudo |
| └─TableRowIDScan_9(Probe) | 250.00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
±------------------------------±--------±----------±---------------------------±----------------------------------------------------+

这个 estrows 是估算出来的,所以我理解这个数量级的偏差是可以接受的。

好的。谢谢

:+1: