MySQL分区:在分区数量和每个分区的大小之间是否存在性能折衷?


10

我有一张大表(几亿行),我想对其进行有效的分区。我的问题是分区大小和分区数量之间是否需要权衡。据我了解,对分区中使用的列的大多数查询都将更快,因为该查询(对于大多数查询)仅需要在适用于该查询的分区中进行搜索。因此,为了最大程度地提高效率,应该将一个大表划分为最大数量的分区,从而使每个分区尽可能小。对于MySQL,这意味着1024个分区。但是拥有大量分区是否存在性能缺陷?是的,如何找到最佳的分区数?

注意:关于stackoverflow已经有一个类似的问题,但是只有一个答案(从我的角度来看)未达到要求。所以我将以自己的方式陈述这个问题...希望更清楚

Answers:


6

让我们比较一下

分区大小

如果您具有以下条件:

  • 表格中的1亿行
  • BTREE索引
  • BTREE中的每个页面拥有1024个密钥

指标是什么样的?

由于LOG(100000000)/ LOG(2)= 26.575424759099,每页树节点具有1024个键的BTREE索引的树高仅为3(CEILING(LOG(100000000)/ LOG(1024)))。在只有三个页面节点的情况下,在每个访问的treenode中对所需密钥进行二进制搜索将导致修剪和隔离大约30个密钥。

分区数

如果您具有以下条件:

  • 表格中的1亿行
  • BTREE索引
  • BTREE中的每个页面拥有1024个密钥
  • 您创建1024个分区

数字会略有不同。

每个分区应具有约97656行。指标现在会变成什么?

由于LOG(97656)/ LOG(2)= 16.575421065795,每页树节点具有1024个键的BTREE索引的树高仅为2(CEILING(LOG(97656)/ LOG(1024)))。在只有两个页面节点的情况下,在每个访问的treenode中对所需密钥进行二进制搜索将导致修剪和隔离大约20个密钥。

结论

散布密钥只会删除一个树级别,但实际上会创建1024个索引。查询不会知道区别。对于分区,搜索时间充其量可能是正常的。但是,请确保所有数据都处于活动状态。否则,您可能只击中了几个分区,而其他数据很少访问的分区仅占用了空间,并且从不经常访问以证明该分区合理。您可能需要担心不同的性能指标(例如XFS的内部碎片整理,ext3与ext4等)。您还需要担心使用的是哪个存储引擎,因为:

  • 与MyISAM相比,InnoDB索引会有点麻烦,因为它必须管理聚簇索引
  • InnoDB会对ibdata1和当前日志文件(ib_logfile0或ib_logfile1)中的数据进行两次写入

1
谢谢RolandoMySQLDBA,这非常有趣。我从中了解到,分区将对查询速度产生很小但可观的积极影响,但会产生其他负面影响,例如碎片化。但是,我感兴趣的是如何确定最佳的分区数。我应该始终使用最大允许数字(即1024)还是在积极和消极影响之间妥协?还是无法分析这种优化?
robguinness 2012年

顺便说一句,这篇文章表明,答案是更有点复杂:mysqlperformanceblog.com/2010/12/11/...
robguinness

答案很好,但这是关于按键(或索引字段)搜索的。我在分区方面没有太多经验,但是从我的观点来看,当您必须进行完整的表格扫描时,它很有用。在这种情况下,您仅扫描几个分区而不是整个表。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.