我们的客户都是同一个数据库的一部分,我们存储他们的所有图像,博客文章等。我想对表格进行分区,以优化每个网站的性能(由" site_id"在每个表中)。
举个例子,让我们使用我们的images
表。可用列包括:image_id(int,primary,auto_inc),site_id(int,primary),width(int),height(int),filesize(int),uploaded(datetime)。
我尝试过添加分区; ALTER TABLE images PARTITION BY KEY(image_id,site_id)
,有效。但是,我无法知道MySQL用于" group"分区 - 它是否针对我想要的进行了优化?那是你们进来的地方。
PARTITION BY KEY是设置分区的正确方法,以获取site_id"分离"彼此?如果不是 - 你会怎么做?
我已经看到人们手动添加分区--p0,p1,p2,p3等。你需要指定分区数,还是MySQL"理解"我在site_id之后?
答案 0 :(得分:0)
问题1
如果你使用按键分区(image_id,site_id),你不能确定每个分区只包含分开的site_id,因为这种分区将使用集成的散列函数(image_id,site_id),结果将是在该分区中确定该行将被插入。
问题2
如果使用RANGE或LIST分区,则必须定义所需的分区数。 即:
PARTITION BY RANGE (site_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);
LIST和RANGE需要一些维护。如果添加/删除了新的site_id,则必须调整分区方案。
KEY分区将确保在指定的分区数上进行平衡的行重新分区:
PARTITION BY KEY(image_id,site_id)
PARTITIONS 10;
希望它有所帮助。
答案 1 :(得分:0)
MySQL分区是一种可行的方法,但听起来你也有理想的分片数据库。对于像这样的简单用例,可以通过简单的方法自行完成,以及可以执行此操作的更多自动化产品。这样,您不仅可以使用单个服务器,还可以在获得更多使用时扩展群集,甚至可以将site_id密钥专门分配给特定服务器(优先考虑更大的客户)。例如,一个非常大的客户可以拥有自己的分片服务器,然后许多小客户可以共同位于一个或多个其他服务器上。如果您有共享表,则可以在所有分片中复制GLOBAL表。如果您需要访问所有客户的数据,则可以支持并行查询。