Mysql版本:5.6
我有一张包含2000万条记录的表格。表的主键是bigint,自动递增。我在id列上使用范围分区:
partition by Range (ID) (
partition p0 values less than (5000000),
partition p1 values less than (10000000),
partition p2 values less than (15000000),
partition p3 values less than (20000000),
partition p4 values less than (25000000),
partition p5 values less than MAXVALUE
);
在基准测试期间,我使用IN子句 -
从每个分区中选择1000个项目SElECT * from t_b WHERE ID in ( 6000, 1000, 499000, 91000, ... );
我有一个脚本来生成这个IN子句。这1000个项目以随机顺序均匀分布在此分区中。以上查询仅选择分区p0。我通过&解析分区验证了......'。
我认为当我在不同的分区上查询时,响应时间会相似。我确保每个查询只包含来自同一分区的1000个项目。
查询结果让我感到惊讶:
[p0] 1.5 seconds,
[p1] 1.3 seconds,
[p2] 0.28 seconds,
[p3] 0.06 seconds.
看起来分区越晚(记录在时间戳方面越新),响应速度越快。 发动机是innodb。当我选择不同的buffer_pool_size时,结果没有太大变化。 (1G,500Meg,250Meg)。
我关闭了查询缓存。 为了在运行不同的查询之间消除buffer_pool的影响,我有意地按顺序在不同的分区上运行查询。例如第一次查询在p1上运行,第二次查询在p4上运行,然后是p2 ...
我运行20多个测试,并且在不同分区上面的响应时间非常一致。
我很困惑,不同分区的响应时间不同的原因是什么。
--------新编辑:
buffer_pool_dump is disabled.
read ahead is disabled.
Additional status check after running sql on one partition,then restart mysql:
[p0] 0.8-0.9 seconds
[p1] 0.7-0.8 seconds
[p2] 1 - 1.2 seconds
[p3] 0.06 seconds
p0
Handler_read_first 17
Handler_read_key 1025
Handler_read_last 0
Handler_read_next 0
Handler_read_prev 0
Handler_read_rnd 0
Handler_read_rnd_next 585
Innodb_buffer_pool_read_ahead_rnd 0
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 7902
Innodb_buffer_pool_reads 1548
-----------------------------
p1
Handler_read_first 17
Handler_read_key 1025
Handler_read_last 0
Handler_read_next 0
Handler_read_prev 0
Handler_read_rnd 0
Handler_read_rnd_next 585
Innodb_buffer_pool_read_ahead_rnd 0
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 7951
Innodb_buffer_pool_reads 1571
-----------------------------
p2
Handler_read_first 17
Handler_read_key 1025
Handler_read_last 0
Handler_read_next 0
Handler_read_prev 0
Handler_read_rnd 0
Handler_read_rnd_next 585
Innodb_buffer_pool_read_ahead_rnd 0
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 7900
Innodb_buffer_pool_reads 1547
-----------------------------
p3
Handler_read_first 3
Handler_read_key 997
Handler_read_last 0
Handler_read_next 0
Handler_read_prev 0
Handler_read_rnd 0
Handler_read_rnd_next 585
Innodb_buffer_pool_read_ahead_rnd 0
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 7632
Innodb_buffer_pool_reads 1558