禁用缓存时数据获取性能提高 6 倍的原因是什么?

问题描述 投票:0回答:2

我正在 Windows 上运行 MySQL 5.5,并且正在尝试优化查询。 但是,我似乎无法取得任何进展,因为当我设定基线时,我得到 131 秒,但如果我重新执行它,我得到 23 秒。 如果我等待一段时间(比如 10 分钟左右),它会返回到 131 秒,但我永远不知道它是否会返回,直到我执行它。 所以我无法真正弄清楚我的优化是否有帮助。 当然,我认为这是由查询缓存引起的,因此将其关闭,但我仍然得到相同的结果。

这是一个具有多个内部连接和几个外部连接的选择。 内连接中的两个表都很大,但通常是在索引上连接。 连接中有几个“in”语句。

所以,我的问题是,什么会导致响应时间发生这种变化? 执行计划缓存? 操作系统文件缓存? 索引缓存? 还有别的吗?

谢谢你!

编辑: 这是查询和表大小:

选择 SQL_NO_CACHE 计数(1)
来自 real_big_table_one ml
在 ml.sid=ltl.sid 上内部加入 Pretty_big_table_one ltl
在 ml.lid=md.lid 上内连接 Pretty_big_table_two md
在ltl.ltlp_id = ltp.ltlp_id 上内连接reference_table ltp
在 ml.sid=o.sid 上左连接 Pretty_big_table_ Three o 且 o.cid 不在(223041,226855,277890,123953,218150,264789,386817,122435,277902,278466,278430,277911,363986,373233,419863)和o.status_id (100,400,500,700,800,900,1000)
在 (1,2) 中将 o.oid=ar.oid 和 ar.status_id 上左连接medium_table ar
其中 ml.date_orig >= '2011-03-01' 且 ml.date_orig < '2011-04-01' and ml.lid=910741

ml 有 50M 行
tlt 有 1M 行
md 有 1M 行
tlp 有 800 行
o 有 7M 行
ar 有 25K 行

mysql caching query-optimization
2个回答
0
投票

操作系统正在第二次缓存驱动器?如果你运行一个 exe 两次,第二次也会更快地出现。


0
投票

数据库服务器并不是唯一缓存数据的东西。操作系统有自己的缓存系统,您正在访问的硬盘驱动器也有自己的缓存系统。这就是您在后续调用中看到性能提高的原因。

要建立基线,您可以从冷启动转到运行查询。这是一个乏味的过程(我自己在大型复杂查询上完成过),但冷启动将确保不缓存任何数据。您还可以简单地丢弃第一个查询,连续运行十个或更多测试查询,并将平均值作为性能基准。即使在冷启动后,您也可以按顺序多次运行查询并取平均值。无论如何,这是一个好主意,可以查看不同情况下的变化,例如页面错误、其他应用程序的峰值(您需要手动复制)等。

© www.soinside.com 2019 - 2024. All rights reserved.