【问题标题】:Horizontal Partitioning in MySQLMySQL 中的水平分区
【发布时间】:2013-07-02 01:33:54
【问题描述】:

我有一个大约 20 列的表格。

-----------------------------------------------------------------
  GUID_PK  |  GUID_SET_ID  |  Col_3  |  Col_4  |  ... | Col_20
-----------------------------------------------------------------

可能有数千个Sets,每个都有几十到不到一千条记录。集合中的记录都是相互关联的。集合是完全相互独立的。在一个大事务中一次读取/写入一整套。一旦记录被写入,它就永远是只读的,永远不会改变,只能读取。很少从该表中删除数据。删除时,一次性全部删除。

只有SET_ID 是传入的外键。 PK 是另一个表的传出外键。在详细表中,每条主记录保留大约 3 或 4 条记录(每个记录一个 blob)。

问题是:我应该对表进行分区吗?我认为是的。我的老板想得更好。他希望动态创建表格,每组一个主一个细节。我个人对动态创建的想法并不满意,但担心一张桌子统治所有人的架构。

批量插入和批量选择肯定会影响性能。批量删除将再次重新排序索引。什么是最佳结构?

【问题讨论】:

  • 当你插入数据时,像Col_x 这样的所有列都会被填充?还是只是一些?
  • @Stephan 一次性填充所有列。实际上,两列可以为空,有时但很少它们可能为空。但以后没有记录更新。已经完成的事情。
  • 在这种情况下,您可以通过GUID_SET_ID 使用哈希dev.mysql.com/doc/refman/5.1/en/partitioning-hash.html 对表进行分区
  • 但散列分区开始时接受固定数量的分区。我如何确定这个数字?是否有任何决策参数?最佳实践?
  • 这取决于您每天收到的数据量

标签: mysql database-design partitioning large-data


【解决方案1】:

考虑到大部分 Col_x 列已填充,您可以执行 HASH PARTITIONING

CREATE TABLE 

....

PARTITION BY HASH(GUID_SET_ID)
PARTITIONS NO_PART;

NO_PART 是你想要的分区数,这应该考虑到:

1) 您每天收到的数据量
2)你估计未来会收到的数据量

您也可以查看其他分区类型here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多