为什么不分区?


10

什么时候不希望对数据库进行分区?(考虑MySQL分区

就我而言

  • 我将从几百万行开始,应该从那里开始。
  • 字符字段上的主键用作最频繁的查询约束(并且查找也很频繁-至少每秒几次)。
  • 主键将被散列为分区键
  • 将对上述频繁查询中提取的每一行进行更新
  • 频率较低的查询(针对日期列或其他查询)将需要访问所有分区

即使到最后一点,查找也不是并行运行的,因此在所有情况下,这都是胜利吗?分区的不利之处是什么?为什么至少在查看百万条记录时,每个人都默认不使用它?

更新-我选择了zgguy的答案,但请注意,我在自己的研究结果中添加了自己的答案,其中包括指向对我非常有用的类似问题的非常好的答案的链接。

Answers:


5

没有解决性能问题的灵丹妙药,分区也不是其中之一。

每个分区本质上都是一个表。因此,以允许数据库仅在一个分区中查找行的方式编写的查询会变得更快。对于需要扫描整个大表的查询而言,差异可能很大,但可以将自身限制为仅扫描分区表中的一个分区。对于唯一的键查找,差异要小得多。

但是,以要求数据库访问所有或大部分表(索引)分区的方式使用索引查找的查询的运行速度将大大降低。

并行执行本身就是一个主题。如果您隔夜运行大量批处理,并且让整个计算机完成一项工作,那么并行化将是一件好事。但是,在OLTP系统中,数据库不断为来自多个并发用户的查询提供服务,您不希望一个用户占用所有资源。


因此,由于PK索引更快,因此唯一/主键查找实际上不会看到很多(如果有的话)改进。这是全面的吗?有时PK指数会变慢吗?如果查询偏向最近添加的PK,该怎么办?导致大多数活动仅命中一个分区的基于PK的分区(我认为分区密钥算法必须是模数或类似的,而不是散列,对吗?)是否会有所帮助?
2015年

主键/唯一键查找充其量只能看到轻微的性能改进。另一方面,如果您的目标是减少DML语句的争用,则应该以某种方式进行分区,以使DML在所有分区上平均分配,而不是只关注其中的几个。
zgguy

很抱歉,在10天后回来,但是您提出了一个要点-您提供了充分的理由来查看可能没有必要进行分区,但是,我的方案包括在读取每条记录后对其进行更新(每秒几条)。是否需要这么多写入才能使分区(分布均匀)更令人信服,从而分散了写负载?
2015年

我还试图了解您对命中许多分区(速度较慢)的查询的评论。如果查询是针对也用作(散列)作为分区键的PK,则数据库是否不基于查找的哈希值立即知道要转到哪个分区?感谢帮助!
2015年

抱歉,最近无法访问堆栈交换。您链接的答案很棒。我相信它可以回答您的两个问题。
zgguy

2

此处的答案写得很好,并且使参数类似于zgguy的答案,分区不会给您带来很多好处(如果有的话),对单机情形很有帮助,在这种情形下,最频繁的查找是基于主键或类似的操作(因为索引查询应该一样快)。

实际上,一个通用的建议线程似乎是分区的主要原因是切线的,并且主要与管理有关:例如,如果您需要经常清除旧记录,则基于日期对数据进行隔离。尽管已指出,如果您的数据使得大多数所有查询仅命中最近添加的记录,这也可以使您的查询性能受益。

我还提到MySQL永远不会并行执行任何操作(很高兴看到一些链接或对此进行更多解释)。

尚未见任何人谈论写作活动是否增加了不同的考虑因素。


我认为写不会改变您的答案。您提到了我发现的4个用例中的2个。即使在8.0中也没有并行性。
瑞克·詹姆斯

1

首先想到的是分区修剪;如果那不是您的查询可以使用的东西。

您是否需要从表中清除大量数据,因为分区将帮助您。虽然年代久远,但是彼得的这篇文章没有什么要考虑的。

人们可以想到的另一件事是简单表的易用性……分区需要额外的工作和维护。


较新的版本具有用于将查询明确限制为分区的语法。我想不出曾经使用过这样的正当理由。
瑞克·詹姆斯
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.