【问题标题】:Auto partition a table in MySQL after reaching a million records达到一百万条记录后在 MySQL 中自动对表进行分区
【发布时间】:2012-09-03 10:29:07
【问题描述】:

我正在使用一个包含超过 2000 万条记录的表,并且运行查询需要大量时间。我可以有一个定义或声明,说如果序列号达到一百万,请使用名称预定义的命名语法(如 table_name_i)进行分区,其中我不断增加。

表定义如下:

Table name - CHIP_DETAILS
Columns - 
  SEQ_NO - INT(10) - Auto Increment
  CHIP_ID - Varchar(16)
  TOKEN - VARCHAR(16)
  CHIP_BLOB (TINY BLOB)
  TOKEN BLOB (TINY BLOB)
  GENERATED_TIMESTAMP - TIMESTAMP
  USER_ID - INT(10)

MYSQL version - MySQL server 5.5.23 
OS - Windows 7 Home Premium - 64 Bit 
RAM - 8 Gigs 
Processor - Intel i5 2.53

非常感谢任何帮助。

【问题讨论】:

  • 我看不出将表分区为多个表会如何提高性能,除非您可以将这些表分布在不同的硬件上,例如不同的服务器或至少不同的硬盘。至少如果您的查询需要对整个表进行操作。如果对于大多数查询而言,表中只有一小部分就足够了,那么确定描述该部分的标准可能比简单地在任意点拆分要好。
  • @MvG - 我将有需要访问整个表的查询,并且拆分数据会使获取速度比查看数百万条记录要快得多,这就是我的想法。可能是我被分区这个词误导了,但我很想听听任何可以帮助我更快地执行查询的技术或技巧。

标签: mysql performance database-design database-performance


【解决方案1】:

如果您将表划分为 n 个不同的表,那么每个表将只包含一个 nth 的数据,所以您可以期望查询速度提高多达 n 倍。但是对于必须处理所有数据的查询,您需要对这些 n 个表中的每一个进行操作,这意味着您将有 n 个这样的查询。在最好的情况下,这会让你回到原来的表现。实际上,准备执行查询所需的持续开销将被执行 n 次而不是一次,因此您几乎肯定会降低性能。

数据库引擎通常设计用于很好地处理大量数据,而 2000 万条记录实际上并没有那么多。所以手动重新分配数据可能没有帮助。相反,您应该检查以确保您拥有suitable indices 以仅访问您实际需要访问的数据库部分。该表可能非常大,但只要您只访问其中的一小部分,您的查询仍然会很快。查看EXPLAIN 命令的输出,了解您认为太慢的查询之一,以了解您可能需要其他索引的位置。 Rewriting the queries,例如为了更好地利用这些指数,也可能有所帮助。 Optimizing a database 是一个复杂的主题,需要更多地了解您实际想要做什么。一个关键信息是读取和写入之间的比率。

正如我在上面的评论中所写,只有当您可以将不同的部分放在不同的硬盘上以便可以并行访问时,拆分表才有意义。在这种情况下,您将需要探索MySQL partitioning features,以便让 MySQL 以最大限度地利用并行访问的方式进行拆分。

【讨论】:

    【解决方案2】:

    应该通过列值对表进行分区,例如日期。如果您将一个月的数据放入每个分区,一个仅涵盖 2 个月数据的查询(这需要在查询的过滤器中明确说明),则优化器只需包含 2 个分区即可提供结果。除非您对数据中的列进行分区(例如月份),并使用任意非基于数据的分区键(如 row_id),否则优化器将如何知道它需要回答查询的数据位于哪些分区中?它必须引用所有分区,然后将所有数据缝合在一起 - 使查询比不分区时更慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2015-09-27
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多