0

我正在使用一个包含超过 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

任何帮助是极大的赞赏。

4

2 回答 2

0

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

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

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

于 2012-09-03T13:31:11.107 回答
0

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

于 2012-09-04T12:16:00.817 回答