2012-10-16 60 views
1

考慮這個例子 - 表item有兩列,keyvalue。數據如下:InnoDB緩存鍵不存在嗎?

> SELECT * FROM item; 

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

假設我們通過1到100之間的隨機鍵進行SELECT查詢,並且數據集很大。我的問題是:

  • 確實InnoDB的緩存莫名其妙「失蹤」鍵,以便它知道密鑰,如3和4不存在,還是必須每次去盤?

  • 如果我們用虛擬記錄填充剩餘的關鍵值,性能會更好嗎?

回答

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/

插入虛擬記錄會使情況變得更糟 - 表格會變大。

0

由於The MySQL Query Cache下記載:一個SELECT聲明

查詢緩存存儲的文本與被髮送到客戶端的相應結果一起。如果稍後收到相同的語句,服務器將從查詢緩存中檢索結果,而不是再次解析並執行該語句。

因此,只有在再次執行完全相同的查詢時纔會使用SELECT * FROM item的緩存。不同的查詢(如SELECT * FROM item WHERE key = 3)不能使用此查詢的緩存(雖然後續調用完全相同的查詢將使用其自己的緩存結果)。

0

您的索引不會引用缺少的記錄,所以這個速度應該不會太慢。您可以選擇添加一個主鍵索引並自動增加記錄並將其添加到您的索引(pk,鍵,值)