InnoDB缓存不存在的密钥吗?

时间:2012-10-16 06:48:47

标签: mysql sql database innodb

考虑此示例 - 表格item有两列,keyvalue。数据如下:

> SELECT * FROM item;

 key       value
------------------
  1          a
  2          b
  87         c

假设我们通过1到100之间的随机键进行SELECT查询,并且数据集很大。我的问题是:

  • InnoDB是否会以某种方式缓存“丢失”密钥,以便它知道密钥(例如3和4)不存在,或者每次都必须进入磁盘?

  • 如果我们用虚拟记录填充剩余的键值,性能会更好吗?

3 个答案:

答案 0 :(得分:0)

正如The MySQL Query Cache所述:

  

查询缓存存储SELECT语句的文本以及发送到客户端的相应结果。如果稍后收到相同的语句,服务器将从查询缓存中检索结果,而不是再次解析和执行语句。

因此,只有在再次执行完全相同的查询时,才会使用SELECT * FROM item的缓存。不同的查询(例如SELECT * FROM item WHERE key = 3)不能使用此查询的缓存(尽管后续调用完全相同的查询将使用其自己的缓存结果)。

答案 1 :(得分:0)

您的索引不会引用丢失的记录,因此这不应该慢。您可以选择将具有自动增量的主键索引添加到记录中,并将其添加到索引(pk,key,value)

答案 2 :(得分:0)

Innodb将经常使用的页面存储在内存中,因此在每次查询时都不会转到磁盘。内存缓冲区的大小在配置文件(通常是my.cnf)中定义,选项名称为innodb_buffer_pool_size。 Innodb文件也可以由操作系统缓存。

如果服务器上有大量可用内存,请考虑将innodb_buffer_pool_size增加到适当的值。有关此内容的更多信息:http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

插入虚拟记录会使情况变得更糟 - 表格会更大。