MySQL和正确设置分区

MySQL和正确设置分区,mysql,database-partitioning,Mysql,Database Partitioning,我们的客户都是同一个数据库的一部分,我们在其中存储他们的所有图像、博客文章等。我想对这些表进行分区,以优化他们每个站点的性能(每个表中由“site_id”指定) 例如,让我们使用图像表。可用的列有:image_id(int,primary,auto_inc)、site_id(int,primary)、width(int)、height(int)、filesize(int)、upload(datetime) 我尝试过添加分区按键(image\u id,site\u id)更改表映像分区,这很有效。

我们的客户都是同一个数据库的一部分,我们在其中存储他们的所有图像、博客文章等。我想对这些表进行分区,以优化他们每个站点的性能(每个表中由“site_id”指定)

例如,让我们使用
图像
表。可用的列有:image_id(int,primary,auto_inc)、site_id(int,primary)、width(int)、height(int)、filesize(int)、upload(datetime)

我尝试过添加分区<代码>按键(image\u id,site\u id)更改表映像分区
,这很有效。然而,我无法知道MySQL使用什么来“分组”分区——它是针对我想要的优化的吗?这就是你们进来的地方

问题1 按键分区是设置分区以使站点id彼此“分离”的正确方法吗?如果不是,你会怎么做

问题2
我已经看到人们正在手动添加分区—p0、p1、p2、p3等。您需要指定分区的数量,还是MySQL“理解”我在寻找站点id?

问题1

如果使用按键分区(image\u id,site\u id),则无法确保每个分区将只包含单独的site\u id,因为这种分区将在(image\u id,site\u id)上使用集成的哈希函数,其结果将确定行将插入哪个分区

如果要确保分离,应使用或分区

问题2

如果使用范围分区或列表分区,则必须定义所需的分区数。 即:

列表和范围需要一些维护。如果添加/删除了新的站点id,则必须调整分区方案

键分区将确保跨指定的分区数进行平衡的行重新分区:

PARTITION BY KEY(image_id,site_id)
PARTITIONS 10;

希望能有所帮助。

MySQL分区是一个不错的选择,但听起来您也有一个理想的情况来切分数据库。对于这样一个简单的用例,有一些简单的方法可以自己完成,而更多的自动化产品也可以完成。这样,您就不局限于一台服务器,您可以随着使用率的提高而扩展集群,甚至可以专门为特定服务器分配站点id密钥(优先考虑较大的客户)。例如,一个真正的大客户可以拥有自己的分片服务器,然后许多小客户可以在一个或多个其他服务器上共存。如果您有共享表,那么有多种方法可以跨所有碎片复制全局表。如果您需要访问所有客户的数据,可以支持并行查询。

谢谢,非常有用。目前我们有大约300个站点ID。是否可以按范围将分区添加到当前范围分区中,或者每次创建新站点id时都必须删除分区并从头开始创建它?我认为我们应该每个站点id有一个分区。或者这可能太过分了?是的,我认为按范围分区有大约300个站点id,按分区有一个站点id有点过分了。你可以用30个站点ID创建10个分区作为一个例子,我担心的是,如果它们不分开,两个使用大量数据的站点ID将位于同一个分区中,并相互破坏。使用单独的分区,它们“都是安全的”。不管怎样,MySQL表中有分区限制吗?你说的“互相搞砸”是什么意思?来自文档:分区的最大数量。在MySQL 5.6.7之前,不使用NDB存储引擎的给定表的最大分区数为1024。从MySQL 5.6.7开始,这个限制增加到8192个分区。不管MySQL服务器版本如何,这个最大值都包括子分区。我所说的“搞砸彼此”只是指由于一个分区获取了大部分内容而导致的性能问题。:)谢谢你的帮助。最后一个问题-按键分区是否必须同时应用于image\u id和site\u id列,或者site\u id是否足够?当然,切分很有趣。对于一个简单的解决方案,设置是什么样子的?您需要跨多个服务器对数据进行分区,并从应用程序中获得一种方法,以了解给定值的碎片。你可以“自己滚”,或者有工具可以帮助你。这里有一份白皮书解释了技术方法,希望能有所帮助。
PARTITION BY KEY(image_id,site_id)
PARTITIONS 10;