innodb維護乙個稱為緩衝池的記憶體儲存區域 ,用於快取記憶體中的資料和索引
innodb緩衝池將表的索引和資料進行快取,緩衝池允許從記憶體直接處理頻繁使用的資料,這加快了處理速度。在專用資料庫伺服器上,通常將多達80%的物理記憶體分配給innodb緩衝池。因為innodb的儲存引擎的工作方式總是將資料庫檔案按頁讀取到緩衝池,每個頁16k預設(innodb_page_size=16k),在mysql 5.7中增加了32kb和64kb頁面大小的支援,之前版本是不允許大於16k的;但你只能在初始化mysql例項之前進行配置,一旦設定了乙個例項的頁面大小,就不能改變它,具體看innodb_page_size引數。然後按最近最少使用(lru)演算法來保留在緩衝池中的快取資料。如果資料庫檔案需要修改,總是首先修改在快取池中的頁(發生修改後,該頁為臟頁),然後再按照一定的頻率將緩衝池的髒也重新整理到檔案中。所有buffer塊位於同一列表,其中後3/8為old,每當新讀入乙個資料塊時,先從隊尾移除同等塊數然後插入到old子列的頭部,如再次訪問該塊則將其移至new子列的頭部。
當使用者需要訪問資料時,innodb首先會在innodb緩衝池查詢資料,如果緩衝池中沒有資料時,innodb會將硬碟上的資料塊插入到innodb快取池中;如果innodb緩衝池已滿,innodb通過lru演算法清楚innodb快取池中個別資料塊。每當有新資料塊需要載入到innodb緩衝池中時,該資料塊應變為『『資料頁』』被插到midpoint的位置,並宣告為old資料頁。那麼old資料頁什麼時候能移動到new page鍊錶中呢?
(1)當innodb_old_blocks_time的引數值設定為0時。當old部分的資料頁被訪問到時,該資料頁會被提公升到鍊錶的頭部,並被標記為new資料頁。
(2)當innodb_old_blocks_time的引數值大於0時(以1000毫秒或者1秒為例)。old部分資料頁插入緩衝池後,1秒之後被訪問,該資料頁會被提公升到鍊錶的頭部,並被標記為new資料頁。在剛插入到一秒內,即便old部分的資料頁被訪問,該資料頁也不會移動到new鍊錶的頭部。
引數設定:
(1)innodb_buffer_pool_size:用於設定innodb快取池(innodb_buffer_pool)的大小,預設值是47mb。innodb快取池的大小對innodb整體效能影響較大,如果當前的mysql伺服器專門用於提供mysql服務,應盡量增加innodb_buffer_pool_size的大小,把頻繁訪問的資料都放到記憶體中來,盡可能減少innodb對硬碟的訪問,爭取將innodb最大化成為乙個記憶體型儲存索引的訪問,爭取將innodb最大化成為乙個記憶體儲存引擎。
(2)innodb_buffer_pool_instances:預設值是1,表示innodb快取池被劃分到乙個區域。適當地增加該引數(例如將該引數值設定為2),此時innodb被劃分成為兩個區域,可以提公升innodb的併發效能。如果innodb快取池被劃分成多個區域,建議每個區域不小於1gb的空間。能夠提供併發效能是因為每個例項都是互斥,多個例項可以提高併發能力
innodb快取池預熱:
從5.6版本開始,mysql支援關閉mysql服務時將記憶體中的熱資料儲存到硬碟,mysql重啟後首先將硬碟中的如資料載入到innodb緩衝池中,以便縮短warmup程序的時間,提高業務繁忙高併發時的效率。
MySQL系列 MyISAM和InnoDB的死鎖
容易發生死鎖的幾種情況如下 多個併發事務 2個或者以上 按照不同的順序同時訪問多張表 比如乙個程式鎖定了a表,然後去申請鎖定b表,另外乙個程式先鎖定的b表,需要同時修改a表 innodb也支援顯式鎖,例如以下語句 1 類似的業務邏輯以固定的順序訪問表和行。2 大事務拆小。大事務更傾向於死鎖,如果業務...
MySQL 5 7 優化InnoDB配置
mysql show variables like innodb 這個是innodb最重要的引數,主要作用是快取innodb表的索引,資料,插入資料時的緩衝,預設值為128m。如果是乙個專用db伺服器,那麼它可以佔到記憶體的70 80 並不是設定的越大越好。設定的過大,會導致system的swap空...
Mysql系列(十) Msql之InnoDB索引
innodb儲存引擎支援以下幾種常見的索引 這裡的雜湊索引是前面提到過的自適應雜湊索引。為innodb自己視情況而定建立的,不能進行認為干預。b 樹索引就是傳統意義上的索引。注意的是b不是代表binary,而是代表balance。可以看到下圖的兩顆都是二叉查詢樹,但是因為構建的方式不同。右圖的二叉樹...