我正在尝试分析两个不同的查询,这些查询执行相同的操作以查找哪个更快。为了进行测试,我将SQL_NO_CACHE放入两个查询中,以防止查询缓存搞乱时间。
查询A始终为50毫秒。 查询B在第一次运行时为100毫秒,如果我在不久之后第二次运行它则为10毫秒。
为什么第二次查询B更快?查询缓存不应该加快查询速度。可能是第一次运行查询B将数据从磁盘加载到内存中,以便第二个查询在内存中运行更快?有没有办法测试这个?我试图通过在运行查询B之前从表中执行select *来自己测试,但它仍然表现出相同的行为。 SQL_NO_CACHE可能无法禁用查询缓存吗?
查询B看起来像这样: SELECT SQL_NO_CACHE foo,bar FROM table1 LEFT JOIN table2 ON table1.foo = table2.foo WHERE bar = 1
答案 0 :(得分:1)
根据索引的大小和表类型,可能是第一次运行查询时索引不在内存中。所以MySQL会在第一次运行查询时将索引拉入内存,从而导致显着减速。下一次,MySQL需要的大部分内存可能会导致性能提升。
答案 1 :(得分:1)
根据您使用的存储引擎,是的,它很可能是从数据缓存而不是查询缓存加载的。
MyISAM不为数据提供存储引擎级缓存,只缓存索引。但是,操作系统通常会从自己的缓存中提供数据,这可能会加快查询执行速度。
您可以尝试在真实场景中对查询进行基准测试,只需在每次执行时将该特定查询记录到数据库(以及其执行时间)。
答案 2 :(得分:0)
您的应用是否在第一次查询时建立连接并进行身份验证握手?如果是这样,第二个查询将具有要执行的打开/验证连接。尝试第三次运行它,看看第二次和第三次尝试是否接近同一时间。