我有8个表,超过2百万行使用INT(4B)PK用于频繁插入和读取。偶尔读取较旧的9/10数据并且访问它所需的时间并不重要,而较新的1/10必须对INSERT和SELECT都快。表格分为两类要求:
因为它应该与innodb_buffer_pool_size设置为32M并且旧数据不重要,我认为最好的解决方案是每周一次将每个表的旧一半复制到大型存档表中。另外,我应该使用infile插入而不是当前的事务。这是一个很好的问题吗?我很感激有关此问题的任何建议和链接。
答案 0 :(得分:2)
如果您使用InnoDB,数据自然是使用表的PRIMARY KEY“聚集”的,如果您定义了一个(即:“id INT NOT NOT PRIMARY KEY AUTO_INCREMENT”),数据按ID分组(和会保持这种状态。)
因此,您最近的INSERTed数据自然地分组在一些InnoDB缓冲区上,而您的旧存档数据根本不重要。 我不认为你会从将数据分成存档表/数据库和最近的数据中受益,除非你会使一切变得更加复杂!
为了加快InnoDB上的插入/更新/删除,您必须考虑InnoDB日志文件的物理位置:InnoDB需要在其中插入修改以实现操作(无论是显式事务还是隐式事务一个!),它不会等待数据或索引放回磁盘。这是一个与MyISAM完全不同的策略。
因此,如果您可以为InnoDB日志文件,10krpm +硬盘驱动器或SSD分配快速顺序存储,并将ibdata保存在另一个驱动器或raid阵列中,您将能够维持数量惊人的数据库修改:它是InnoDB日志文件的IO绑定(例外情况是你在更新/删除时使用复杂或重的where子句。)