如果表已在mysql中分片,是否还需要分区?

时间:2018-06-16 19:27:50

标签: mysql innodb mysql-5.7

背景:MySQL 5.7,InnoDB引擎

我们有一个巨大的事务日志表(每天600万个新行),我们希望将这个巨大的表分成多个mysql实例和表(所以我们有table_001,table_002等)。用户经常查询他们最近的行,这意味着最近的行是热的,而旧行是冷的。

我想知道在这种情况下每个分片表(table_001,table_002等)中是否还需要mysql分区。我的意见不是。如果我们已经将数据分片到许多子表中,为什么我们需要使用分区的另一种子表? (分区内部实际上是单独的表吗?)

1 个答案:

答案 0 :(得分:0)

有四种方法可以拆分表:

  • “共享”-几个服务器中的每一个上的一些行。这对于“写缩放”很有用。 (似乎不适用于您。)
  • “分区”-一种特殊的语法,可以构建子表,但可以像引用单个表一样引用它。通过这种方式增强性能的情况很少。我们需要查看您的查询以进一步讨论此问题。
  • 手动将表拆分为table_001,依此类推-一次又一次地在此论坛上建议这样做。总是把它当作一个坏主意。
  • “复制”-通过将多个从设备挂在一个主设备上,您可以获得“读取缩放”。这将允许同时进行更多查询。 (我认为这不是您的“正确”解决方案。)在复制中,您必须写到一个位置,并且可以获得许多相同的数据副本。

您要删除“旧”数据吗?如果是这样,PARTITION BY RANGE(TO_DAYS(..))可使清除效率更高。但这并不一定提高SELECT的效果;让我们看看您的SELECTs

您是否会像数据仓库的“报告”那样“汇总”数据?如果是这样,我们可以进一步讨论。

re:插入率

使用InnoDB,单个大表实际上很容易INSERT成为多个小表或多个分区。 200不是很大的插入率。

  • 您是否“批量”插入插件?也就是说,INSERT ... VALUES (...), (...), ...;?还是使用LOAD DATA?这些都可能维持在1000 /秒以上。
  • 您有很多INDEXes吗?它们在一定程度上给高插入率带来了负担。让我们看看SHOW CREATE TABLE,以便我们进一步讨论。
  • 您有多个线程在做INSERTs吗?
  • 要获得很高的插入率,请参阅this
  • SSD允许更高的插入率。