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

标签 mysql performance database-partitioning large-data

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

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

我该怎么做才能获得更好的性能?

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

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

还有其他办法吗?

最佳答案

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

如果您想使用分区,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 万行或更多,但性能却很好。他们使用不同的方法,包括(排名不分先后):

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

关于MySQL 大量记录的性能 - 分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499004/

相关文章:

php - 计算日期

javascript - 我想向 myTable 添加过滤、分页

mysql - 无法使用 Apache Kafka 和 Debezium 从联合 MySQL 表中读取数据

c# - 预加载 WPF 窗口(可能在其他线程中)以提高性能

hadoop - Hive动态分区无法将分区写入最终子目录

python - 将 MySQL 查询结果添加到 R 数据框

sql-server - 新建数据库的性能测试

c++ - 哪个更好地检查 std::string 中是否存在字符?查找还是 find_first_of?

mysql - 如何在不删除 MySQL 数据的情况下删除分区?

sql - MAX()和MAX()OVER PARTITION BY在Teradata查询中产生错误3504