gpt4 book ai didi

mysql - InnoDB 上的一个简单的 INSERT 查询花费太多

转载 作者:可可西里 更新时间:2023-11-01 08:20:58 26 4
gpt4 key购买 nike

我有这个简单的查询:

INSERT IGNORE INTO beststat (bestid,period,rawView) VALUES ( 4510724 , 201205 , 1 ) 

在 table 上:

CREATE TABLE `beststat` (
`bestid` int(11) unsigned NOT NULL,
`period` mediumint(8) unsigned NOT NULL,
`view` mediumint(8) unsigned NOT NULL DEFAULT '0',
`rawView` mediumint(8) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`bestid`,`period`),
) ENGINE=InnoDB AUTO_INCREMENT=2020577 DEFAULT CHARSET=utf8

完成需要 1 秒。


旁注:实际上并不总是需要 1 秒。有时它甚至在 0.05 秒内完成。但通常需要 1 秒


此表 (beststat) 当前有 ~500'000 条记录,其大小为:40MB。我有 4GB RAMinnodb 缓冲池大小 = 104,857,600,其中: Mysql:5.1.49-3

这是我数据库中唯一的InnoDB表(其他都是MyISAM)

ANALYZE TABLE beststat 显示:OK

也许 InnoDB 设置有问题?

最佳答案

大约 3 年前,作为客户评估项目的一部分,我运行了一些模拟。他们需要能够搜索不断添加数据的表格,并且他们希望最新数据最多保持一分钟。

InnoDB 在开始时显示出更好的结果,但很快就恶化了(远在 100 万条记录之前),直到我删除了所有索引(包括主索引)。在这一点上,InnoDB 在执行插入/更新时已经优于 MyISAM。 (我的硬件比你差得多,只能在我的笔记本电脑上执行测试。)

结论:如果您有索引,尤其是唯一索引,插入将始终受到影响。

我建议进行以下优化:

  1. 从您的 beststat 表中删除所有索引并将其用作简单的转储。
  2. 如果您真的需要这些唯一索引,请考虑一些可编程的解决方案(例如始终记住最大 bestid,并坚持新记录高于该数字 - 并立即增加该数字。(但您真的需要这么多吗?独特的字段 - 它们对我来说就像索引一样。)
  3. 有一个后台线程将新记录从 InnoDB 移动到另一个表(可以是 MyISAM),在那里它们将被索引。
  4. 考虑暂时删除索引,然后在批量更新后重新索引表,可能会切换两个表,这样查询就不会中断。

我承认,这些是理论上的解决方案,但对于您的问题,这是我能说的最好的解决方案。

哦,如果您的表计划增长到数百万,请考虑使用 NoSQL 解决方案。

关于mysql - InnoDB 上的一个简单的 INSERT 查询花费太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10562749/

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