我正在使用一个拥有超过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
非常感谢任何帮助。
答案 0 :(得分:0)
如果将表分区为say n 不同的表,那么每个表只包含一个 n th 的数据,所以您可以期望查询更快达到 n 。但是对于必须处理所有数据的查询,您需要对这些 n 表中的每一个进行操作,这意味着您将有 n 这样的查询。在最好的情况下,这会让您回到原来的表现。实际上,准备查询执行所需的常量开销将执行 n 次而不是一次,因此您几乎肯定会降低性能。
数据库引擎通常用于处理大量数据,而且2000万条记录并不是那么多。因此,手动重新分发数据可能不会有帮助。您应该检查以确保只有suitable indices访问您实际需要访问的数据库部分。该表可能非常庞大,但只要您只访问其中的一小部分,您的查询仍然会很快。查看EXPLAIN
命令的输出,查看您认为太慢的查询之一,看看您可能需要其他索引的位置。 Rewriting the queries,例如为了更好地利用这些指数,也可能有所帮助。 Optimizing a database是一个复杂的主题,需要更多地了解您实际上要做的事情。一个关键信息是读写比率。
正如我在上面的评论中写道的那样,只有将不同的部分放在不同的硬盘上才能拆分表才有意义,这样就可以并行访问它们。在这种情况下,您需要探索MySQL partitioning features,以便让MySQL以最大化并行访问的使用方式进行拆分。
答案 1 :(得分:0)
应通过列值(例如date)对表进行分区。如果您将一个月的数据放入每个分区,一个仅涵盖2个月数据的查询(这需要在查询的过滤器中明确显示),优化器只需要包含2个分区即可结果。除非您对数据中的列进行分区(对于exaple月),并使用任意非基于数据的分区键(如row_id),优化器将如何知道回答查询所需的数据所在的分区?它必须引用所有分区,然后将所有数据重新拼接在一起 - 使查询比没有分区时更慢。