索引失效

我在7.1.2测试 limit 下推是生效的而且Keeporder: true 。你那个新集群上收集过统计信息吗?

我这边在查询前对四张表都做了analyze table,统计信息应该没有问题的

我又进行了一次测试,主要纬度是

  • 主键是否聚簇索引
  • 是否分区
  • 分区采用周维度还是月维度

建表语句如下

-- test.test_clustered definition

CREATE TABLE `test_clustered` (
  `day` date NOT NULL,
  `partner_org_id` varchar(60) NOT NULL,
  `partner_name` text DEFAULT NULL,
  `customer_org_id` varchar(60) NOT NULL,
  `license_id` varchar(255) NOT NULL,
  PRIMARY KEY (`day`,`partner_org_id`,`customer_org_id`,`license_id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;


-- test.test_clustered_seq_part definition

CREATE TABLE `test_clustered_seq_part` (
  `day` date NOT NULL,
  `partner_org_id` varchar(60) NOT NULL,
  `partner_name` text DEFAULT NULL,
  `customer_org_id` varchar(60) NOT NULL,
  `license_id` varchar(255) NOT NULL,
  PRIMARY KEY (`day`,`partner_org_id`,`customer_org_id`,`license_id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE (TO_DAYS(`day`))
(PARTITION `p201912` VALUES LESS THAN (737790),
 PARTITION `p202001` VALUES LESS THAN (737821),
 PARTITION `p202002` VALUES LESS THAN (737850),
 PARTITION `p202003` VALUES LESS THAN (737881),
 PARTITION `p202004` VALUES LESS THAN (737911),
 PARTITION `p202005` VALUES LESS THAN (737942),
 PARTITION `p202006` VALUES LESS THAN (737972),
 PARTITION `p202007` VALUES LESS THAN (738003),
 PARTITION `p202008` VALUES LESS THAN (738034),
 PARTITION `p202009` VALUES LESS THAN (738064),
 PARTITION `p202010` VALUES LESS THAN (738095),
 PARTITION `p202011` VALUES LESS THAN (738125),
 PARTITION `p202012` VALUES LESS THAN (738156),
 PARTITION `p202101` VALUES LESS THAN (738187),
 PARTITION `p202102` VALUES LESS THAN (738215),
 PARTITION `p202103` VALUES LESS THAN (738246),
 PARTITION `p202104` VALUES LESS THAN (738276),
 PARTITION `p202105` VALUES LESS THAN (738307),
 PARTITION `p202106` VALUES LESS THAN (738337),
 PARTITION `p202107` VALUES LESS THAN (738368),
 PARTITION `p202108` VALUES LESS THAN (738399),
 PARTITION `p202109` VALUES LESS THAN (738429),
 PARTITION `p202110` VALUES LESS THAN (738460),
 PARTITION `p202111` VALUES LESS THAN (738490),
 PARTITION `p202112` VALUES LESS THAN (738521),
 PARTITION `p202201` VALUES LESS THAN (738552),
 PARTITION `p202202` VALUES LESS THAN (738580),
 PARTITION `p202203` VALUES LESS THAN (738611),
 PARTITION `p202204` VALUES LESS THAN (738641),
 PARTITION `p202205` VALUES LESS THAN (738672),
 PARTITION `p202206` VALUES LESS THAN (738702),
 PARTITION `p202207` VALUES LESS THAN (738733),
 PARTITION `p202208` VALUES LESS THAN (738764),
 PARTITION `p202209` VALUES LESS THAN (738794),
 PARTITION `p202210` VALUES LESS THAN (738825),
 PARTITION `p202211` VALUES LESS THAN (738855),
 PARTITION `p202212` VALUES LESS THAN (738886),
 PARTITION `p202301` VALUES LESS THAN (738917),
 PARTITION `p202302` VALUES LESS THAN (738945),
 PARTITION `p202303` VALUES LESS THAN (738976),
 PARTITION `p202304` VALUES LESS THAN (739006),
 PARTITION `p202305` VALUES LESS THAN (739037),
 PARTITION `p202306` VALUES LESS THAN (739067),
 PARTITION `p202307` VALUES LESS THAN (739098),
 PARTITION `p202308` VALUES LESS THAN (739129),
 PARTITION `p202309` VALUES LESS THAN (739159),
 PARTITION `p202310` VALUES LESS THAN (739190),
 PARTITION `p202311` VALUES LESS THAN (739220),
 PARTITION `p202312` VALUES LESS THAN (739251));


-- test.test_clustered_weekday_part definition

CREATE TABLE `test_clustered_weekday_part` (
  `day` date NOT NULL,
  `partner_org_id` varchar(60) NOT NULL,
  `partner_name` text DEFAULT NULL,
  `customer_org_id` varchar(60) NOT NULL,
  `license_id` varchar(255) NOT NULL,
  PRIMARY KEY (`day`,`partner_org_id`,`customer_org_id`,`license_id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE (WEEKDAY(`day`))
(PARTITION `p0` VALUES LESS THAN (1),
 PARTITION `p1` VALUES LESS THAN (2),
 PARTITION `p2` VALUES LESS THAN (3),
 PARTITION `p3` VALUES LESS THAN (4),
 PARTITION `p4` VALUES LESS THAN (5),
 PARTITION `p5` VALUES LESS THAN (6),
 PARTITION `p6` VALUES LESS THAN (7));


-- test.test_nonclustered definition

CREATE TABLE `test_nonclustered` (
  `day` date NOT NULL,
  `partner_org_id` varchar(60) NOT NULL,
  `partner_name` text DEFAULT NULL,
  `customer_org_id` varchar(60) NOT NULL,
  `license_id` varchar(255) NOT NULL,
  PRIMARY KEY (`day`,`partner_org_id`,`customer_org_id`,`license_id`) /*T![clustered_index] NONCLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;


-- test.test_nonclustered_seq_part definition

CREATE TABLE `test_nonclustered_seq_part` (
  `day` date NOT NULL,
  `partner_org_id` varchar(60) NOT NULL,
  `partner_name` text DEFAULT NULL,
  `customer_org_id` varchar(60) NOT NULL,
  `license_id` varchar(255) NOT NULL,
  PRIMARY KEY (`day`,`partner_org_id`,`customer_org_id`,`license_id`) /*T![clustered_index] NONCLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE (TO_DAYS(`day`))
(PARTITION `p201912` VALUES LESS THAN (737790),
 PARTITION `p202001` VALUES LESS THAN (737821),
 PARTITION `p202002` VALUES LESS THAN (737850),
 PARTITION `p202003` VALUES LESS THAN (737881),
 PARTITION `p202004` VALUES LESS THAN (737911),
 PARTITION `p202005` VALUES LESS THAN (737942),
 PARTITION `p202006` VALUES LESS THAN (737972),
 PARTITION `p202007` VALUES LESS THAN (738003),
 PARTITION `p202008` VALUES LESS THAN (738034),
 PARTITION `p202009` VALUES LESS THAN (738064),
 PARTITION `p202010` VALUES LESS THAN (738095),
 PARTITION `p202011` VALUES LESS THAN (738125),
 PARTITION `p202012` VALUES LESS THAN (738156),
 PARTITION `p202101` VALUES LESS THAN (738187),
 PARTITION `p202102` VALUES LESS THAN (738215),
 PARTITION `p202103` VALUES LESS THAN (738246),
 PARTITION `p202104` VALUES LESS THAN (738276),
 PARTITION `p202105` VALUES LESS THAN (738307),
 PARTITION `p202106` VALUES LESS THAN (738337),
 PARTITION `p202107` VALUES LESS THAN (738368),
 PARTITION `p202108` VALUES LESS THAN (738399),
 PARTITION `p202109` VALUES LESS THAN (738429),
 PARTITION `p202110` VALUES LESS THAN (738460),
 PARTITION `p202111` VALUES LESS THAN (738490),
 PARTITION `p202112` VALUES LESS THAN (738521),
 PARTITION `p202201` VALUES LESS THAN (738552),
 PARTITION `p202202` VALUES LESS THAN (738580),
 PARTITION `p202203` VALUES LESS THAN (738611),
 PARTITION `p202204` VALUES LESS THAN (738641),
 PARTITION `p202205` VALUES LESS THAN (738672),
 PARTITION `p202206` VALUES LESS THAN (738702),
 PARTITION `p202207` VALUES LESS THAN (738733),
 PARTITION `p202208` VALUES LESS THAN (738764),
 PARTITION `p202209` VALUES LESS THAN (738794),
 PARTITION `p202210` VALUES LESS THAN (738825),
 PARTITION `p202211` VALUES LESS THAN (738855),
 PARTITION `p202212` VALUES LESS THAN (738886),
 PARTITION `p202301` VALUES LESS THAN (738917),
 PARTITION `p202302` VALUES LESS THAN (738945),
 PARTITION `p202303` VALUES LESS THAN (738976),
 PARTITION `p202304` VALUES LESS THAN (739006),
 PARTITION `p202305` VALUES LESS THAN (739037),
 PARTITION `p202306` VALUES LESS THAN (739067),
 PARTITION `p202307` VALUES LESS THAN (739098),
 PARTITION `p202308` VALUES LESS THAN (739129),
 PARTITION `p202309` VALUES LESS THAN (739159),
 PARTITION `p202310` VALUES LESS THAN (739190),
 PARTITION `p202311` VALUES LESS THAN (739220),
 PARTITION `p202312` VALUES LESS THAN (739251));


-- test.test_nonclustered_weekday_part definition

CREATE TABLE `test_nonclustered_weekday_part` (
  `day` date NOT NULL,
  `partner_org_id` varchar(60) NOT NULL,
  `partner_name` text DEFAULT NULL,
  `customer_org_id` varchar(60) NOT NULL,
  `license_id` varchar(255) NOT NULL,
  PRIMARY KEY (`day`,`partner_org_id`,`customer_org_id`,`license_id`) /*T![clustered_index] NONCLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE (WEEKDAY(`day`))
(PARTITION `p0` VALUES LESS THAN (1),
 PARTITION `p1` VALUES LESS THAN (2),
 PARTITION `p2` VALUES LESS THAN (3),
 PARTITION `p3` VALUES LESS THAN (4),
 PARTITION `p4` VALUES LESS THAN (5),
 PARTITION `p5` VALUES LESS THAN (6),
 PARTITION `p6` VALUES LESS THAN (7));

针对上述6张表有如下查询结果

explain analyze select * from test_clustered order by day limit 10;
Limit_10  10.00 10  root    time:603.3µs, loops:2 offset:0, count:10  N/A N/A
└─TableReader_17  10.00 10  root    time:601.5µs, loops:1, cop_task: {num: 1, max: 528.3µs, proc_keys: 10, rpc_num: 1, rpc_time: 509.2µs, copr_cache_hit_ratio: 0.00, distsql_concurrency: 1} data:Limit_16 2.04 KB N/A
  └─Limit_16  10.00 10  cop[tikv]   tikv_task:{time:0s, loops:1}, scan_detail: {total_process_keys: 10, total_process_keys_size: 2386, total_keys: 11, get_snapshot_time: 22.9µs, rocksdb: {key_skipped_count: 10, block: {cache_hit_count: 2}}}  offset:0, count:10  N/A N/A
    └─TableFullScan_15  10.00 10  cop[tikv] table:test_clustered  tikv_task:{time:0s, loops:1}  keep order:true N/A N/A
--------------------------------------------------------------------------------
explain analyze select * from test_clustered_seq_part order by day limit 10;
TopN_7  10.00 10  root    time:2.85s, loops:2 test.test_clustered_seq_part.day, offset:0, count:10  2.37 KB N/A
└─TableReader_14  10.00 100000  root  partition:all time:2.85s, loops:100, cop_task: {num: 10029, max: 1.05ms, min: 186.2µs, avg: 273µs, p95: 328µs, max_proc_keys: 10, p95_proc_keys: 10, rpc_num: 10029, rpc_time: 2.69s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 1} data:Limit_13 3.95 KB N/A
  └─Limit_13  10.00 100000  cop[tikv]   tikv_task:{proc max:4ms, min:0s, avg: 41.9µs, p80:0s, p95:0s, iters:10029, tasks:10029}, scan_detail: {total_process_keys: 100000, total_process_keys_size: 23877833, total_keys: 110029, get_snapshot_time: 58.9ms, rocksdb: {key_skipped_count: 100000, block: {cache_hit_count: 20417}}} offset:0, count:10  N/A N/A
    └─TableFullScan_12  100585.00 100000  cop[tikv] table:test_clustered_seq_part tikv_task:{proc max:4ms, min:0s, avg: 40.7µs, p80:0s, p95:0s, iters:10029, tasks:10029} keep order:false  N/A N/A
--------------------------------------------------------------------------------
explain analyze select * from test_clustered_weekday_part order by day limit 10;
TopN_7  10.00 10  root    time:2.89s, loops:2 test.test_clustered_weekday_part.day, offset:0, count:10  2.37 KB N/A
└─TableReader_14  10.00 100000  root  partition:all time:2.89s, loops:100, cop_task: {num: 10004, max: 12.3ms, min: 172.1µs, avg: 277.5µs, p95: 325.3µs, max_proc_keys: 10, p95_proc_keys: 10, rpc_num: 10004, rpc_time: 2.73s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 1} data:Limit_13 3.95 KB N/A
  └─Limit_13  10.00 100000  cop[tikv]   tikv_task:{proc max:4ms, min:0s, avg: 34.8µs, p80:0s, p95:0s, iters:10004, tasks:10004}, scan_detail: {total_process_keys: 100000, total_process_keys_size: 23877833, total_keys: 110004, get_snapshot_time: 38ms, rocksdb: {key_skipped_count: 100000, block: {cache_hit_count: 20373}}} offset:0, count:10  N/A N/A
    └─TableFullScan_12  100000.00 100000  cop[tikv] table:test_clustered_weekday_part tikv_task:{proc max:4ms, min:0s, avg: 34µs, p80:0s, p95:0s, iters:10004, tasks:10004} keep order:false  N/A N/A
--------------------------------------------------------------------------------
explain analyze select * from test_nonclustered order by day limit 10;
Limit_11  10.00 10  root    time:1.24ms, loops:2  offset:0, count:10  N/A N/A
└─Projection_19 10.00 10  root    time:1.24ms, loops:1, Concurrency:OFF test.test_nonclustered.day, test.test_nonclustered.partner_org_id, test.test_nonclustered.partner_name, test.test_nonclustered.customer_org_id, test.test_nonclustered.license_id 87.2 KB N/A
  └─IndexLookUp_18  10.00 10  root    time:1.24ms, loops:1, index_task: {total_time: 1.18ms, fetch_handle: 1.17ms, build: 8.37µs, wait: 2.35µs}, table_task: {total_time: 567.8µs, num: 1, concurrency: 5}    22.9 KB N/A
    ├─Limit_17(Build) 10.00 20  cop[tikv]   time:1.16ms, loops:4, cop_task: {num: 2, max: 468.5µs, min: 434.5µs, avg: 451.5µs, p95: 468.5µs, max_proc_keys: 10, p95_proc_keys: 10, rpc_num: 2, rpc_time: 868.6µs, copr_cache_hit_ratio: 0.00, distsql_concurrency: 1}, tikv_task:{proc max:0s, min:0s, avg: 0s, p80:0s, p95:0s, iters:2, tasks:2}, scan_detail: {total_process_keys: 20, total_process_keys_size: 3292, total_keys: 22, get_snapshot_time: 26.2µs, rocksdb: {key_skipped_count: 20, block: {cache_hit_count: 5}}} offset:0, count:10  N/A N/A
    │ └─IndexFullScan_15  10.00 20  cop[tikv] table:test_nonclustered, index:PRIMARY(day, partner_org_id, customer_org_id, license_id)  tikv_task:{proc max:0s, min:0s, avg: 0s, p80:0s, p95:0s, iters:2, tasks:2}  keep order:true N/A N/A
    └─TableRowIDScan_16(Probe)  10.00 10  cop[tikv] table:test_nonclustered time:449.2µs, loops:2, cop_task: {num: 1, max: 393.6µs, proc_keys: 10, rpc_num: 1, rpc_time: 369.1µs, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}, tikv_task:{time:0s, loops:1}, scan_detail: {total_process_keys: 10, total_process_keys_size: 1866, total_keys: 10, get_snapshot_time: 4.25µs, rocksdb: {block: {cache_hit_count: 21}}}  keep order:false  N/A N/A
--------------------------------------------------------------------------------
explain analyze select * from test_nonclustered_seq_part order by day limit 10;
TopN_7  10.00 10  root    time:23.8ms, loops:2  test.test_nonclustered_seq_part.day, offset:0, count:10 9.48 KB N/A
└─TableReader_14  10.00 480 root  partition:all time:23.8ms, loops:3, cop_task: {num: 49, max: 8.76ms, min: 2.92ms, avg: 5.5ms, p95: 8.38ms, max_proc_keys: 2277, p95_proc_keys: 2198, tot_proc: 133ms, tot_wait: 74ms, rpc_num: 50, rpc_time: 269.5ms, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}, backoff{regionMiss: 2ms}  data:TopN_13  3.82 KB N/A
  └─TopN_13 10.00 480 cop[tikv]   tikv_task:{proc max:8ms, min:0s, avg: 3.18ms, p80:4ms, p95:8ms, iters:130, tasks:49}, scan_detail: {total_process_keys: 100000, total_process_keys_size: 18677833, total_keys: 100049, get_snapshot_time: 62.5ms, rocksdb: {key_skipped_count: 100000, block: {cache_hit_count: 102, read_count: 301, read_byte: 8.39 MB, read_time: 2.83ms}}}  test.test_nonclustered_seq_part.day, offset:0, count:10 N/A N/A
    └─TableFullScan_12  100000.00 100000  cop[tikv] table:test_nonclustered_seq_part  tikv_task:{proc max:8ms, min:0s, avg: 3.1ms, p80:4ms, p95:8ms, iters:130, tasks:49} keep order:false  N/A N/A
--------------------------------------------------------------------------------
explain analyze select * from test_nonclustered_weekday_part order by day limit 10;
TopN_7  10.00 10  root    time:17.2ms, loops:2  test.test_nonclustered_weekday_part.day, offset:0, count:10 2.37 KB N/A
└─TableReader_14  10.00 70  root  partition:all time:17.2ms, loops:3, cop_task: {num: 7, max: 17ms, min: 16.1ms, avg: 16.5ms, p95: 17ms, max_proc_keys: 14376, p95_proc_keys: 14376, tot_proc: 106ms, rpc_num: 7, rpc_time: 115.4ms, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15} data:TopN_13  3.82 KB N/A
  └─TopN_13 10.00 70  cop[tikv]   tikv_task:{proc max:16ms, min:12ms, avg: 15.4ms, p80:16ms, p95:16ms, iters:99, tasks:7}, scan_detail: {total_process_keys: 100000, total_process_keys_size: 18677833, total_keys: 100007, get_snapshot_time: 2.89ms, rocksdb: {key_skipped_count: 100000, block: {cache_hit_count: 17, read_count: 305, read_byte: 8.84 MB, read_time: 2.67ms}}}  test.test_nonclustered_weekday_part.day, offset:0, count:10 N/A N/A
    └─TableFullScan_12  100000.00 100000  cop[tikv] table:test_nonclustered_weekday_part  tikv_task:{proc max:16ms, min:12ms, avg: 14.9ms, p80:16ms, p95:16ms, iters:99, tasks:7} keep order:false  N/A N/A

所以我理解聚簇索引效率的下降主要是因为存在分区导致的,当聚簇索引不存在分区时查询很快
通过执行计划看起来聚簇索引的分区内是无序的,需要扫描分区内所有的记录来获取查询结果,而不是像非聚簇索引一样,只需要使用TopN算子来获取分区内最大的几个记录转交即可

而对于是否因为没有使用分区键导致查询效率下降,我使用了如下查询验证,即便在顺序分区中使用了day来查询,仍然是扫描了全部的记录

explain analyze select * from test_clustered_seq_part where day >= "2020-02-01" order by day limit 10;
TopN_8	10.00	10	root		time:2.83s, loops:2	test.test_clustered_seq_part.day, offset:0, count:10	2.37 KB	N/A
└─TableReader_15	10.00	97945	root	partition:p202002,p202003,p202004,p202005,p202006,p202007,p202008,p202009,p202010,p202011,p202012,p202101,p202102,p202103,p202104,p202105,p202106,p202107,p202108,p202109,p202110,p202111,p202112,p202201,p202202,p202203,p202204,p202205,p202206,p202207,p202208,p202209,p202210,p202211,p202212,p202301,p202302,p202303,p202304,p202305,p202306,p202307,p202308,p202309,p202310,p202311,p202312	time:2.83s, loops:98, cop_task: {num: 9822, max: 1.24ms, min: 188.7µs, avg: 276.2µs, p95: 330.6µs, max_proc_keys: 10, p95_proc_keys: 10, rpc_num: 9822, rpc_time: 2.66s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 1}	data:Limit_14	3.95 KB	N/A
  └─Limit_14	10.00	97945	cop[tikv]		tikv_task:{proc max:4ms, min:0s, avg: 30.5µs, p80:0s, p95:0s, iters:9822, tasks:9822}, scan_detail: {total_process_keys: 97945, total_process_keys_size: 23387123, total_keys: 107767, get_snapshot_time: 58.8ms, rocksdb: {key_skipped_count: 97945, block: {cache_hit_count: 19997}}}	offset:0, count:10	N/A	N/A
    └─TableRangeScan_13	100585.00	97945	cop[tikv]	table:test_clustered_seq_part	tikv_task:{proc max:4ms, min:0s, avg: 30.5µs, p80:0s, p95:0s, iters:9822, tasks:9822}	range:[2020-02-01,+inf], keep order:false	N/A	N/A

关于添加分区键查询后的测试结果

explain analyze select * from test_clustered_seq_part where TO_DAYS(day) > 737790 order by day limit 10;
TopN_8	10.00	10	root		time:27.4ms, loops:2	test.test_clustered_seq_part.day, offset:0, count:10	58.7 KB	N/A
└─Selection_15	80468.00	99940	root		time:24.8ms, loops:100	gt(to_days(test.test_clustered_seq_part.day), 737790)	221.1 KB	N/A
  └─TableReader_14	100585.00	100000	root	partition:all	time:12.1ms, loops:100, cop_task: {num: 193, max: 3.52ms, min: 484.2µs, avg: 1.35ms, p95: 2.62ms, max_proc_keys: 992, p95_proc_keys: 992, tot_proc: 22ms, rpc_num: 193, rpc_time: 258.8ms, copr_cache_hit_ratio: 0.02, distsql_concurrency: 15}	data:TableFullScan_13	926.0 KB	N/A
    └─TableFullScan_13	100585.00	100000	cop[tikv]	table:test_clustered_seq_part	tikv_task:{proc max:4ms, min:0s, avg: 476.7µs, p80:0s, p95:4ms, iters:776, tasks:193}, scan_detail: {total_process_keys: 97024, total_process_keys_size: 23167260, total_keys: 97214, get_snapshot_time: 1.27ms, rocksdb: {key_skipped_count: 97024, block: {cache_hit_count: 995}}}	keep order:false	N/A	N/A
---------------------------------------------------------------------------
explain analyze select * from test_clustered_seq_part order by day limit 10;
TopN_7	10.00	10	root		time:3.05s, loops:2	test.test_clustered_seq_part.day, offset:0, count:10	2.37 KB	N/A
└─TableReader_14	10.00	100000	root	partition:all	time:3.05s, loops:100, cop_task: {num: 10029, max: 903.3µs, min: 217.6µs, avg: 282.1µs, p95: 370.5µs, max_proc_keys: 10, p95_proc_keys: 10, rpc_num: 10030, rpc_time: 2.78s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 1}	data:Limit_13	3.96 KB	N/A
  └─Limit_13	10.00	100000	cop[tikv]		tikv_task:{proc max:4ms, min:0s, avg: 28.3µs, p80:0s, p95:0s, iters:10029, tasks:10029}, scan_detail: {total_process_keys: 100000, total_process_keys_size: 23877833, total_keys: 110029, get_snapshot_time: 37.8ms, rocksdb: {key_skipped_count: 100000, block: {cache_hit_count: 20109, read_count: 314, read_byte: 8.84 MB, read_time: 3.78ms}}}	offset:0, count:10	N/A	N/A
    └─TableFullScan_12	100585.00	100000	cop[tikv]	table:test_clustered_seq_part	tikv_task:{proc max:4ms, min:0s, avg: 28.3µs, p80:0s, p95:0s, iters:10029, tasks:10029}	keep order:false	N/A	N/A
---------------------------------------------------------------------------
explain analyze select * from test_nonclustered_seq_part where TO_DAYS(day) > 737790 order by day limit 10;
TopN_8	10.00	10	root		time:111.8ms, loops:2	test.test_nonclustered_seq_part.day, offset:0, count:10	11.2 KB	N/A
└─Selection_15	80000.00	99940	root		time:109ms, loops:100	gt(to_days(test.test_nonclustered_seq_part.day), 737790)	218.3 KB	N/A
  └─TableReader_14	100000.00	100000	root	partition:all	time:94ms, loops:100, cop_task: {num: 193, max: 82.9ms, min: 677.7µs, avg: 8.27ms, p95: 80.6ms, max_proc_keys: 992, p95_proc_keys: 992, tot_proc: 21ms, tot_wait: 92ms, rpc_num: 193, rpc_time: 1.59s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}	data:TableFullScan_13	578.7 KB	N/A
    └─TableFullScan_13	100000.00	100000	cop[tikv]	table:test_nonclustered_seq_part	tikv_task:{proc max:4ms, min:0s, avg: 476.7µs, p80:0s, p95:4ms, iters:776, tasks:193}, scan_detail: {total_process_keys: 100000, total_process_keys_size: 18677833, total_keys: 100193, get_snapshot_time: 15.8ms, rocksdb: {key_skipped_count: 100000, block: {cache_hit_count: 693}}}	keep order:false	N/A	N/A
---------------------------------------------------------------------------
explain analyze select * from test_nonclustered_seq_part order by day limit 10;
TopN_7	10.00	10	root		time:63.6ms, loops:2	test.test_nonclustered_seq_part.day, offset:0, count:10	2.37 KB	N/A
└─TableReader_14	10.00	480	root	partition:all	time:63.6ms, loops:3, cop_task: {num: 49, max: 41.8ms, min: 463.9µs, avg: 11.7ms, p95: 35.1ms, max_proc_keys: 2277, p95_proc_keys: 2191, tot_proc: 340ms, tot_wait: 171ms, rpc_num: 64, rpc_time: 581.4ms, copr_cache_hit_ratio: 0.02, distsql_concurrency: 15}	data:TopN_13	3.82 KB	N/A
  └─TopN_13	10.00	480	cop[tikv]		tikv_task:{proc max:36ms, min:0s, avg: 7.35ms, p80:8ms, p95:32ms, iters:130, tasks:49}, scan_detail: {total_process_keys: 97785, total_process_keys_size: 18264142, total_keys: 97833, get_snapshot_time: 302.3µs, rocksdb: {key_skipped_count: 97785, block: {cache_hit_count: 78, read_count: 317, read_byte: 8.49 MB, read_time: 2.55ms}}}	test.test_nonclustered_seq_part.day, offset:0, count:10	N/A	N/A
    └─TableFullScan_12	100000.00	100000	cop[tikv]	table:test_nonclustered_seq_part	tikv_task:{proc max:36ms, min:0s, avg: 7.18ms, p80:8ms, p95:32ms, iters:130, tasks:49}	keep order:false	N/A	N/A

理论上range分区,region也是按range排序的,分区内数据应该是有序的 还是实现问题。下面这个issue描述是后续可能针对分区建的Order by优化。

统计信息可以试着更新一下