【问题标题】:MySQL performance with large number of records - partitioning?具有大量记录的 MySQL 性能 - 分区?
【发布时间】:2013-05-06 03:02:08
【问题描述】:

我正在尝试构建一个包含大量记录的数据库,每个记录都有很多列(字段)——所有表总共可能有大约 200-300 个字段。假设几年后我将拥有大约 40.000.000 到 60.000.000 条记录。

我计划对数据库进行规范化,所以我将有很多表(大约 30-40 个)-> 和很多查询连接。 数据库将与美国严格相关,这意味着查询将仅基于 50 个州(如果进行查询,则不允许在多个州进行搜索/插入/等,而只允许一个州)。

我可以做些什么来获得更好的性能?

有人提出将所有状态保存在不同表结构中的想法,这意味着我将有 50 个表 * 30-40 个用于数据(大约 200 个表)!我是否应该考虑这种方法?

下一个想法是使用基于美国 50 个州的分区。这个怎么样?

还有其他方法吗?

【问题讨论】:

  • 使用分区,再想想表中的200个字段,肯定应该归一化。
  • @rMX,我认为 200-300 列超过 30-40 个表,因此平均每个表 5-10 列。

标签: mysql performance database-partitioning large-data


【解决方案1】:

最佳优化取决于您运行的查询,而不是您的表结构。

如果你想使用分区,this can be a great optimization,如果分区方案支持你需要优化的查询。例如,您可以按美国各州进行分区,这将有助于查询特定州的数据。 MySQL 支持“分区修剪”,因此查询只会针对特定分区运行——但前提是您的查询提到了您用作分区键的列的特定值。

您可以随时使用 EXPLAIN PARTITIONS 检查分区修剪是否有效:

EXPLAIN PARTITIONS
SELECT ... FROM MyTable WHERE state = 'NY';

这应该报告查询使用单个分区。

如果您需要按日期运行查询,那么分区将无济于事; MySQL 将不得不对所有 50 个分区重复查询。

EXPLAIN PARTITIONS
SELECT ... FROM MyTable WHERE date > '2013-05-01';

这将列出所有分区。查询所有分区有一点开销,所以如果这是您的典型查询,您可能应该使用按日期进行范围分区。

因此,请根据查询选择分区键。

任何其他优化技术都遵循类似的模式——它有助于某些查询,可能对其他查询不利。因此,在决定优化方法之前,请确保您知道需要优化哪些查询。


你的评论:

当然有很多数据库有 4000 万行或更多,但性能很好。他们使用不同的方法,包括(不分先后):

我上面的观点是,只有知道需要优化的查询,才能选择最佳的优化方法。此外,不同查询的最佳选择可能不同,甚至可能改变随着数据或流量的增长。优化是一个持续的过程,因为在您看到数据如何增长以及数据库接收的查询流量之前,您不会知道瓶颈在哪里。

【讨论】:

  • 如果我根本不使用分区会发生什么?保留 4000 万条记录的表会导致性能混乱吗?您能否就如何正确设计性能提供一些其他想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2013-05-09
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多