1

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

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

我该怎么做才能有更好的表现?

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

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

还有什么办法吗?

4

1 回答 1

2

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

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

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

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

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

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

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

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

所以选择你的分区键时要考虑到查询。

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


回复您的评论:

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

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

于 2013-05-11T17:00:23.410 回答