我正在尝试构建一个包含大量记录的数据库,每个记录都有很多列(字段) - 对于所有表,总共大约200-300个字段。假设我在几年内会有大约40.000.000到60.000.000的记录。
我打算规范化数据库,所以我会有很多表(大约30-40) - >和查询的很多连接。 数据库将严格与美国相关,这意味着查询将仅基于50个州(如果进行查询,则不允许在多个状态中搜索/插入/等,但只允许一个)。
如何才能获得更好的表现呢?
有人想到将所有状态都放在不同的表结构中,这意味着我将拥有50个表* 30-40个数据(约200个表)!我应该考虑这种方法吗?
下一个想法是使用基于美国50个州的分区。怎么样?
还有其他方式吗?
答案 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万行或更多,但性能良好。他们使用不同的方法,包括(没有特别的顺序):
我的观点是在您知道需要优化的查询之前,您无法选择最佳的优化方法。此外,对于不同的查询,最佳选择可能会有所不同,甚至可能会发生变化随着时间的推移,数据或流量会增长优化是一个持续的过程,因为在您看到数据增长情况以及数据库收到的查询流量之前,您不会知道瓶颈在哪里。