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 搜索条件的细微差别会产生巨大的差异,我无法理解它