我在Windows上运行MySQL 5.5,我正在尝试优化查询。然而,我似乎无法取得任何进展,因为当我基线时我得到131s,但如果我重新执行它我会得到23s。如果我等待一段时间(比如10分钟左右),它会回到131s,但我不知道它是否会在我执行它之前回来。所以我无法弄清楚我的优化是否有所帮助。当然,我认为它是由查询缓存引起的,所以关闭它但我仍然得到相同的结果。
这是一个具有多个内连接和一对外连接的选择。内连接中的两个表都是大的,但它通常连接索引。连接中有几个“in”语句。
所以,我的问题是,什么会导致响应时间的这种变化?执行计划缓存? OS文件缓存?索引缓存?还有别的吗?
谢谢!
编辑: 以下是查询和表格大小:
选择SQL_NO_CACHE count(1)
来自reall_big_table_one ml
内联接pretty_big_table_one ltl on ml.sid = ltl.sid
内部联接pretty_big_table_two md on ml.lid = md.lid
ltl.ltlp_id = ltp.ltlp_id的内连接reference_table ltp
左边加入pretty_big_table_three o on ml.sid = o.sid and o.cid not in(223041,226855,277890,123953,218150,264789,386817,122435,277902,278466,278430,277911,363986,373233,419863) o.status_id in(100,400,500,700,800,900,1000)
在(1,2)中将o加入media_table ar放在o.oid = ar.oid和ar.status_id上
其中ml.date_orig> ='2011-03-01'和ml.date_orig< '2011-04-01'和ml.lid = 910741
ml有50M行
tlt有1M行
md有1M行
tlp有800行
o有7M行
ar有25K行
答案 0 :(得分:0)
操作系统第二次缓存驱动器?如果你运行两次exe,那么第二次运行速度会快得多。
答案 1 :(得分:0)
数据库服务器不是唯一缓存数据的东西。操作系统拥有自己的缓存系统,您访问的硬盘也是如此。这就是你在后续电话中看到性能提升的原因。
要建立基准,您可以从冷启动到运行查询。这是一个繁琐的过程(我自己在大型复杂查询中完成了这个过程)但是冷启动会确保没有数据被缓存。您也可以简单地抛出第一个查询,连续运行十个或更多测试查询,并将平均值作为性能基准。您也可以按顺序运行查询多次,即使在冷启动后也可以取平均值。无论如何,这是一个好主意,看看在不同情况下会发生什么变化,例如页面错误,来自其他应用程序的尖峰(你想要手动复制)等等。