InnoDB Clustered Index 儲存在記憶體下?
首先,我是關於內部數據庫的新手,如果我的問題很愚蠢,對不起。
我在 Stackoverflow(最終連結後)中讀到 InnoDB 聚集索引儲存在磁碟和記憶體中。
我已經讀過聚集索引葉節點有行數據。
我的問題是:基於上面的肯定,如果我的數據庫有一個巨大的表,而這個表有一個聚集索引,那麼這樣的聚集索引會佔用我很大的記憶體空間嗎?
如果我的問題的答案是肯定的,這不是一件壞事嗎?只是在記憶體中有二級索引並根據二級索引結果訪問磁碟不是更好嗎?
索引和數據頁儲存在 innodb 緩衝池中。只有這些索引的活動部分和被載入。最近最少使用的數據/索引從 innodb 緩衝池(記憶體)中清除。
為表創建一個最小的、經常搜尋的、唯一的列的主鍵,因此它是一個聚集索引。
創建提高查詢性能所需的二級索引。
有足夠的 innodb 緩衝池來適應記憶體中的活動工作數據集。查看全域狀態中的
innodb_buffer_pool_reads
vsinnodb_buffer_pool_read_requests
以查看磁碟中的內容以及記憶體中的內容。
您設置 InnoDB 緩衝池使用的最大 RAM 量。它是配置選項innodb_buffer_pool_size。
如果表的聚集索引大於緩衝池,顯然它不能同時保存在 RAM 中。緩衝池使用“最近最少使用”算法來儲存聚集索引的頁面子集。當您的查詢訪問表的不同部分時,緩衝池會驅逐一些頁面,以便將其他頁面從磁碟載入到 RAM 中。這會自動發生,因為查詢需要磁碟中的頁面。
還有一些其他的微妙之處,因為 InnoDB 確實保留了兩個獨立的記憶體池。如果一個給定的頁面被多次訪問,它會被移動到它有更多權重的池中,並且不會很快被驅逐。只使用一次的頁面更容易被驅逐。這很好,因為它可以防止
mysqldump
您破壞 RAM 中最佳頁面的良好平衡。您是否需要將整個表一次性放入緩衝池中?可能不會,除非您進行大量表掃描。
一個典型的應用程序只對錶的一小部分進行頻繁訪問,而對錶的其餘部分的查詢頻率較低。隨著時間的推移,緩衝池中的頁面子集很可能成為您最常執行的查詢最有價值的頁面子集。這就是所謂的數據“工作集”。