具有大量记录的MySQL性能 - 分区?

时间:2013-05-11 15:53:40

标签: mysql performance database-partitioning large-data

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

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

如何才能获得更好的表现呢?

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

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

还有其他方式吗?

1 个答案:

答案 0 :(得分:2)

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

如果要使用分区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万行或更多,但性能良好。他们使用不同的方法,包括(没有特别的顺序):

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