gpt4 book ai didi

大表的 MySQL InnoDB INSERT 性能

转载 作者:行者123 更新时间:2023-11-29 06:56:55 25 4
gpt4 key购买 nike

我有 8 个表,超过 200 万行,使用 INT(4B) PK 用于频繁插入和读取。较旧的 9/10 数据偶尔会被读取,访问它需要多长时间并不重要,而较新的 1/10 数据对于 INSERT 和 SELECT 都必须是快速的。这些表分为两类要求:

  1. 100 次插入/秒
  2. 20 次插入/秒,偶尔更新

因为它应该在 innodb_buffer_pool_size 设置为 32M 的情况下工作并且旧数据不重要,我认为最好的解决方案是每周一次将每个表的旧一半复制到大存档表中。另外我应该使用 infile 插入而不是当前事务。这是一个很好的解决方案吗?对于有关此问题的任何建议和链接,我将不胜感激。

最佳答案

如果您使用的是 InnoDB,数据自然会使用表的 PRIMARY KEY 进行“聚类”,如果您定义了一个(即:“id INT NOT NULL PRIMARY KEY AUTO_INCREMENT”),则数据会按 ID(和将保持这种状态)。

因此,您最近的 INSERTed 数据自然地分组在一些 InnoDB 缓冲区中,而您的旧存档数据根本无关紧要。我认为将数据拆分为存档表/数据库和最近的数据不会让您受益,除非您会使一切变得更加复杂!

要加快 InnoDB 上的插入/更新/删除,您必须考虑 InnoDB 日志文件的物理位置:InnoDB 需要将修改插入其中以实现操作(无论是显式事务还是隐式事务)一个!),它不会等待数据或索引放回磁盘中。这是一个与 MyISAM 完全不同的策略。

因此,如果您可以为 InnoDB 日志文件、10krpm+ 硬盘驱动器或 SSD 分配快速顺序存储,并将 ibdata 保存在另一个驱动器或 raid-array 中,您将能够承受数量惊人的数据库修改:它是 InnoDB 日志文件上的 IO 绑定(bind)(异常(exception)情况是您在更新/删除时使用复杂或繁重的 where 子句)。

关于大表的 MySQL InnoDB INSERT 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12187626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com