我一直在努力解决只有在数据库空闲了一段时间才能查询数据时才会出现的问题.第一个查询将非常慢,大约30秒,然后相关查询将快速像0.1秒.我假设这与缓存有关,但我一直无法找到它的原因.
将mysql变量tmp_table_size,max_heap_table_size更改为更大的大小除了在内存中创建临时表之外没有任何效果.
我不认为这与查询本身有关,因为它被很好地编入索引,并且在第一次慢查询之后,同一查询的变体不会出现在慢查询日志中.我最感兴趣的是尝试确定此原因或重置违规缓存的方法,以便我可以解决问题.
Mar*_*rkR 11
innodb数据文件的页面缓存在innodb缓冲池中.这是你所期望的.即使在良好的硬盘驱动器上,读取文件也很慢,特别是随机读取,这主要是数据库看到的.
可能是您的第一个查询正在执行某种表扫描,这会将大量页面拉入缓冲池,然后快速访问它们.或类似的东西.
这是我所期待的.
理想情况下,对所有表使用相同的引擎(例外:系统表,临时表(可能)和非常小的表或短期表).如果你不这样做,那么他们必须为公羊而战.
假设您的所有表都是innodb,请使缓冲池最多使用服务器物理RAM的75%(假设您没有在计算机上运行太多其他任务).
然后你就可以将你的数据库的12G左右放入ram中,所以一旦它"热身",你的数据库中"最常用的"12G就会处于ram状态,访问它的速度非常快.
一些mysql用户倾向于在重新启动后"预热"生产服务器,将他们从另一台机器复制的查询发送一段时间(这些将是复制从属服务器),直到将它们添加到生产池中.这避免了缓存冷却时看到的极端缓慢.例如,Youtube就是这样做的(至少它已经习惯了;谷歌买了它们,现在他们可能会使用Google-fu)
MySQL 工作台:
以下内容与此 SO 问题并非 100% 相关,但症状非常相关,这是搜索“mysql workbench slow”或相关术语时的第一个 SO 结果,因此希望对其他人有用。
清除查询历史!- 遵循MySql Workbench 查询历史记录(上次执行的查询/查询)的过程,即创建/更改表、选择、插入更新查询以清除 MySQL Workbench 的查询历史记录,这对我来说确实加快了程序的运行速度。
总之:将Output
窗格更改为History Output
,右键单击日期并选择Delete All Logs
。
我遇到的问题是“第一次查询很慢”,因为即使持续时间/获取时间远低于 1 秒,加载结果也需要几秒钟。清除我的查询历史记录后,持续时间/提取时间保持不变(远低于 1 秒,因此实际上没有改变数据库行为),但现在结果立即加载,而不是延迟几秒钟。