mysql把
表的資料詞典資訊以.frm檔案的形式存在資料庫目錄裡,所有mysql儲存引擎都是這樣的。但是每個innodb表在表空間內的innodb內部資料詞典裡也有它自己的條目。當mysql移除表或資料庫,它不得不刪除.frm檔案和innodb資料詞典內的相應條目。這就是為什麼你不能在資料庫之間簡單地移動.frm檔案來移動innodb表。
1、聚集索引和第二索引
每個innodb有乙個叫聚集索引(
clustered index)的
特殊索引
,行的資料被存於其中。
通過聚集索引訪問行速度很快,因為行資料與索引掃瞄頭部在同一資料頁上。如果表是巨大的,當對於那些索引與資料放在不同資料頁上的方案,聚集索引構架通常更節約磁碟i/o。(比如,myisam用乙個檔案存放資料,另外乙個檔案存放索引)。
2、索引的物理結構
所有innodb的索引是b樹索引,這種索引記錄被儲存在樹的葉子頁上。乙個索引頁的預設大小是16kb。當新記錄被插入,innodb會為將來索引記錄的插入和更新留下十六分之一的頁空間。
如果索引記錄以連續的順序被插入(公升序或者降序),結果索引頁大約是15/16滿。如果記錄被以隨機的順序被插入,頁面是從1/2到 15/16滿。如果索引頁的填充因子降到低於1/2,innodb會收縮索引樹來釋放頁。
3、插入緩衝
在資料庫應用中,主鍵是乙個唯一的識別符,並且新行被以主鍵的公升序來插入,這是個常見的情況。因此,聚集索引的插入不需要磁碟的隨機讀。
另一方面,第二索引通常是非唯一的,第二索引的插入
順序也相對隨機。這可能會導致大量的隨機磁碟i/o操作,而沒有乙個被用在innodb中的專用機制。
如果乙個索引記錄應該被插入到乙個非唯一第二索引,innodb檢查第二索引頁是否在緩衝池中。如果是,innodb直接插入到索引頁。如果索引頁沒有在緩衝池中被發現,innodb插入記錄到乙個專門的插入緩衝結構。插入緩衝被保持得如此小以至於它完全適合在緩衝池,並且可以非常快地做插入。
插入緩衝周期性地被合併到資料庫中第二索引樹里。把數個插入合併到索引樹的同一頁,節省磁碟i/o操作,經常地這是有可能的。據測量,插入緩衝可以提高到表的插入速度達15倍。
在插入事務被提交之後,插入緩衝合併可能連續發生。實際上,伺服器關閉和重啟之後,這會連續發生。
當許多第二索引必須被更新,並且許多行已被插入之時,插入緩衝合併可能需要數個小時。在這期間內,磁碟i/o將會增加,這樣會導致磁碟
約束查詢明顯緩慢。另乙個明顯的後台i/o操作是淨化(purge)執行緒
4、 自適應的雜湊索引
如果乙個表幾乎完全快取在主記憶體中,在其上執行查詢最快的方法就是使用雜湊索引。innodb有乙個自動機制,它監視對為乙個表定義的索引的索引搜尋。如果innodb注意到查詢會從建立乙個雜湊索引中獲益,它會自動地這麼做。
注意,雜湊索引總是基於表上已存在的b樹索引來建立。根據innodb對b樹索引觀察的搜尋方式,innodb會在為該b樹定義的任何長度的鍵的乙個字首上建立雜湊索引。 雜湊索引可以是部分的:它不要求整個b樹索引被快取在緩衝池。innodb根據需要對被經常訪問的索引的那些頁面建立雜湊索引。
在某種意義上,innodb通過自適應的雜湊索引機制來調整自己,使其更加貼近主記憶體資料庫的架構。
5、物理行結構 innodb表的物理行結構取決於表建立時指定的行格式。在mysql 5.1中,innodb預設使用緊湊(compact)格式,但為
了保留與舊版本mysql的相容性,冗餘(redundant)格式也可用。檢視innodb表的行格式,可使用show table
status命令。
緊湊的行格式大約可減少20%的儲存空間,但某些操作會增加cpu使用量。如果是乙個典型的受限於快取記憶體命中率和
磁碟速度的工作負荷,使用緊湊格式可能會更快。如果是一種少見工作負荷情況,由於有限的cpu速度,緊湊格式可
能會比較慢。
使用冗餘行格式的innodb錶行具有以下特點:
使用緊湊行格式的innodb錶行具有以下特點:
學習筆記 mysql索引原理之InnoDB
innodb是事務安全的mysql儲存引擎,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。1 執行緒 後台的執行緒主要負責 重新整理記憶體池中的資料,保證緩衝池中的記憶體快取的是最近的資料 將已修改的資料檔案重新整理到磁碟檔案 保證在資料庫發生異常情況下innodb能恢復到正常狀...
mysql索引 Innodb和MyIsam引擎
mysql主要有兩大儲存引擎,innodb和myisam 兩大引擎的底層索引實現也有區別。innodb 主要是聚集索引和輔助索引 聚集索引,實現是將主鍵id作為索引,以b 樹的結構儲存,葉子節點儲存的是整條id以及其對應的表記錄,id唯一,每次通過id走索引直接查到對應的記錄,效率最高 輔助索引,以...
索引之innodb和myisam
innodb和myisam的diff 參考文章 what myisam 索引檔案和資料檔案是分開的。索引檔案中葉子結點的data部分,僅僅是資料記錄的位址。它的主索引和輔助索引在結構上沒有區別,資料上主索引的key是唯一的,輔助索引上的key可以重複。主索引 上圖中col1為主鍵,即該 primar...