MySQL是否缓存查询?


19

我正在将MySQL数据库与PHP数据对象(PDO)接口并执行广泛的SQL查询。通常,大约需要1500毫秒;我仍然需要对其进行优化。当我两次运行PHP脚本并且间隔很短时,查询只需要90毫秒。在两种情况下查询都是相同的。当我使用相同的查询运行脚本时,再次经过一段时间后,又需要1500毫秒。

这是为什么?数据库会自动缓存吗?数据库是否有一段时间保存高速缓存,然后自动将其删除?

我假设结果不能被PHP缓存,因为这发生在两个不同的线程中。我不认为PHP会缓存结果,因为它不知道数据库是否已更改。

我每分钟都会运行一个脚本,以向数据库中插入新行。这也可能是一段时间后再次花费1500毫秒的原因。缓存将被删除,因为相关的表不再相同。


给我看看你的代码。我不需要您的查询,只是一种如何测试它的方式。

3
是的,mySQL缓存查询。那样聪明。

@Kasyx什么代码?它只是基本的PDO,但是我不认为PHP可以缓存它,因为我两次运行了PHP脚本,也没有一次在一个脚本中运行两次查询。还可以解释一下为什么在与问题无关的情况下编辑pdo的原因吗?

3
所有DBMS都有某种页面级缓存。许多方法通过缓存查询执行计划甚至查询结果(包括MySQL)来实现这一点。我怀疑这最后一件事是您观察到的行为的主要原因。
Branko Dimitrijevic 2013年

你每分钟都在做插入吗?排序先出来!
Grant Thomas

Answers:


15

这可能是MySQL查询缓存的产物

您执行SQL查询,MySQL将高速缓存其结果和下一次执行。当您运行脚本以将数据插入查询所引用的表中时,结果缓存将失效,并且下一次必须“真正”执行查询。

从上面链接的MySQL文档中:

几乎完全由固定的一组SELECT语句组成的查询混合比启用INSERT频繁导致缓存结果连续无效的混合更有可能从启用缓存中受益。


5

是的,mySQL(与所有其他流行的数据库产品相同)缓存对其查询。

缓存非常聪明-即使查询的确切参数不同,它也经常可以将缓存用于查询。这会对性能产生很大的影响。

缓存完全在DB服务器软件内部控制;您对缓存中包含的内容没有任何了解,也看不到给定项目在缓存中保留多长时间;它可以在任何给定的时刻被覆盖,这取决于调用其他查询的方式,等等。它可以帮助提高性能,但是不应依赖它来提高性能。

您可以在MySQL手册中阅读有关它的更多信息。

此外,使用PDO可使您将查询写为“ Prepared statement”,而不是将参数硬编码为纯文本查询字符串,而是将参数绑定在一起。这对数据库服务器也有缓存的影响,对于重复的查询,也将提高性能。


2
“从MySQL 5.1.17开始,在第8.6.3.1节“查询缓存的操作方式”中所述的条件下,查询缓存用于预准备语句。在5.1.17之前,查询缓存不用于预准备语句。” dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
与所有其他流行的数据库产品相同 ”:有点误导。几乎没有任何DBMS可以像MySQL一样主动地缓存查询结果。DBMS通常只缓存表(或索引)数据,而不缓存查询结果。他们中的大多数人确实缓存了查询执行计划(和查询“源”)
a_horse_with_no_name 2013年

3
“即使查询的确切参数不相同,它也经常可以将缓存用于查询”是完全错误的。该查询必须与先前执行且仍在缓存的查询逐字节地相同,以便从缓存中得到服务。即使之间的区别SELECT *select *手段否则,相同的查询将不会从缓存中。 dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html。发布的5.1链接出于一致性考虑,但适用于所有版本。
迈克尔-sqlbot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.