mysql 执行时间的巨大差异:最小 2 秒 - 最大 120 秒

Posted

技术标签:

【中文标题】mysql 执行时间的巨大差异:最小 2 秒 - 最大 120 秒【英文标题】:big differences in mysql execution time: minimum 2 secs - maximum 120 secs 【发布时间】:2014-05-08 14:43:44 【问题描述】:

情况: 我使用(php)cronjob 来保持我的数据库是最新的。受影响的表包含大约 40,000 条记录。基本上,cronjob 删除所有条目并在之后插入它们(具有不同的 c 值)。我必须这样做,因为它们真的都在改变,因为它们都是相互关联的。

问题: 实际上,一切正常。 cronjob 在 1.5 到 2 秒内完成了他的工作(同样,对于大约 40k 插入 - 我认为这已经足够了)。 MOSTLY.. 但有时,查询需要 60、90 甚至 120 秒!

我索引了我的数据库。而且我认为查询效果很好,因为它只需要 2 秒的时间。我通过 mysql_close() 关闭连接;

你有什么想法吗?如果您需要更多信息,请告诉我。 提前致谢。

编辑:好吧,插入似乎没有问题。这是一个复杂的 SELECT 查询,带来了一些麻烦。 Tho,感谢所有回答的人!

【问题讨论】:

可能有记录锁定? 还有其他 cronjobs 在该表上工作吗?否则是否大量使用?您使用什么数据库引擎? @Joe Meyer:抱歉,“记录锁定”是什么意思? @TheChaos:好吧,我还有另一个 cronjob 在那个表上工作,但我设置了 10 分钟的时间差。数据库引擎:mysql MyISAM 协议 10. 这些信息有帮助吗?你是说数据库引擎吗? 启用慢查询日志,检查究竟是什么减慢了它。不要使用 MyISAM,使用 InnoDB。此外,对于计划的操作,您可以使用 MySQL 事件调度程序而不是 cron,因此您的数据库可以自我修复或使用 cronjob 进行任何操作。 【参考方案1】:

[对不起,我还没有掌握格式]

根据我的阅读,我可以得出结论,您的 cronjob 正在使用批量插入语句。如果您知道 cronjob 何时工作,我建议您启动数据库引擎优化顾问会话,并查看 cronjob 执行其操作时正在运行的其他进程。批量插入对字段数和行数有一些限制。你可以看这个msdn的字幕http://technet.microsoft.com/en-us/library/ms188365.aspx

性能注意事项

如果要刷新的页数 单个批次超过内部阈值,缓冲区的完整扫描 批处理时可能会出现池以确定要刷新的页面 提交。此完整扫描可能会损害批量导入性能。一个可能的 超过内部阈值的情况发生时,一个大缓冲区 pool 与慢速 I/O 子系统相结合。避免缓冲 在大型机器上溢出,要么不使用 TABLOCK 提示(其中 将删除批量优化)或使用较小的批量大小 (保留批量优化)。由于计算机各不相同,我们 建议您使用数据加载测试各种批量大小 找出最适合您的方法。

【讨论】:

感谢您的回复!但是我只能通过 phpMyAdmin 访问数据库,所以我认为我不能这样做,可以吗? 啊,是的!我刚刚注意到您标记了 MySQL 而不是 SQL。还没有喝到我的第一杯咖啡。你能告诉我你的cronjob做什么吗?是用infile命令吗? 不,它没有使用 infile 命令(据我所知;))。如上所述:cronjob 执行以下操作: 1. 从 abc 中删除 bcd=efg 2. 插入 abc (a, b, c) 值 (1, 2, 3), (4,5,6),。 ..基本上就是这样。另外首先还有另一个选择查询。我需要它来生成新条目 很好。我强烈建议修改作业,以便使用 infile 命令。这相当于 SQL 中的批量插入或 BCP。您应该会看到性能大幅提升。 嗯,我没听错吧?我应该使用“LOAD DATA INFILE”将数据插入数据库而不是 INSERT INTO?所以一种可能的方法是生成一个 .txt 并通过 LOAD DATA INFILE “将其加载到数据表中”,对吧?

以上是关于mysql 执行时间的巨大差异:最小 2 秒 - 最大 120 秒的主要内容,如果未能解决你的问题,请参考以下文章

映射器执行时间之间的巨大差异

两个相似查询的巨大速度差异(MySQL ORDER 子句)

MYSQL 搜索条件的细微差别会产生巨大的差异,我无法理解它

我如何使用 mysql 选择查询在“x 小时 y 分钟 z 秒”之类的词中获得 2 次之间的差异

oracle 10g 和 9i 之间巨大的查询执行时间差异

用于矩阵计算的操作系统之间的巨大性能差异