1. 程式人生 > >MySQL技術內幕InnoDB儲存引擎-01mysql體系結構和儲存引擎

MySQL技術內幕InnoDB儲存引擎-01mysql體系結構和儲存引擎

1.定義資料庫和例項

資料庫 (database): 物理作業系統檔案或其他形式檔案型別的集合。

例項(instance) : MySQL資料庫由後臺執行緒以及一個共享記憶體區組成,共享記憶體可以被執行的後臺執行緒所共享,資料庫例項才是真正用於操作資料庫檔案的。

mysql被設計為一個單程序多執行緒架構的資料庫,mysql資料庫例項在系統上的表現就是一個程序。

當啟動例項時,MySQL資料庫會去讀配置檔案,根據配置檔案的引數來啟動資料庫例項。

在MySQL資料庫中,可以沒有配置檔案,在這種情況下,MySQL會按照預設引數設定啟動例項。

MySQL資料庫是按 /etc/my.cnf , /etc/mysql/my.cnf ,/usr/local/mysql/etc/my.cnf , /.my.cnf 的順序讀取配置檔案 以讀取到的最後一個配置檔案中的引數為準。

Linux環境下,配置檔案一般放在 /etc/my.cnf下 。

配置檔案中有一個引數 datadir , 該引數指定了資料庫所在的路徑。Linux中,預設datadir 為 /usr/local/mysql/data,使用者可以修改該引數。

檢視命令: show variables like ‘datatdir’ \G

2.mysql體系結構

這裡寫圖片描述

MySQL的組成部分:
(1)連線池元件 Connections Pool
(2) 管理服務和工具元件 Management Service & Utilities
(3) SQL介面元件 SQL Interface
(4)查詢分析器元件 Parser Quary Translation Object Privilege
(5) 優化器元件 Optimizer Access Paths
(6) 緩衝元件 Cache
(7)外掛式儲存引擎 Pluggable Storage Engines
(8)物理檔案 File
mysql資料庫區別於其他資料庫的最重要的一個特點就是其外掛式的表儲存引擎,這個引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必須的。
儲存引擎是基於表的,而不是資料庫。

3.mysql儲存引擎

儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法

MySQL中的資料用各種不同的技術儲存在檔案(或記憶體)中,這些技術中的每一種技術都使用不同的儲存機制,索引技巧,鎖定水平並且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術及配套的相關功能稱為儲存引擎。

MySQL 中檢視引擎:
1、show engines; // 檢視mysql所支援的儲存引擎,以及從中得到mysql預設的儲存引擎。

2、show variables like ‘% storage_engine’; // 檢視mysql 預設的儲存引擎

3、show create table tablename ; // 檢視具體某一個表所使用的儲存引擎,這個預設儲存引擎被修改了!

4、show table status from database where name=”tablename”
//準確檢視某個資料庫中的某一表所使用的儲存引擎

innoDB儲存引擎
InnoDb儲存引擎支援事務,其設計目標主要面向線上事務處理的應用,其特點是行鎖設計,支援外來鍵,並支援類似於oracle的非鎖定讀,即預設讀取操作不會產生鎖。mysql從5.5.8版本開始,InnoDB儲存引擎是預設的儲存引擎

(1) innodb儲存引擎的mysql表提供了事務,回滾以及系統崩潰修復能力和多版本併發控制的事務的安全。

(2)innodb支援自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空的話怎會進行自動存現有的值開始增值,如果有但是比現在的還大,則就儲存這個值。

(3)innodb儲存引擎支援外來鍵(foreign key) ,外來鍵所在的表稱為子表而所依賴的表稱為父表。

(4)innodb儲存引擎最重要的是支援事務,以及事務相關聯功能。

(5)innodb儲存引擎支援mvcc的行級鎖。(mvcc類似於java中的讀鎖具體介紹可以看這篇文章:http://blog.csdn.net/chosen0ne/article/details/18093187

(6)innodb儲存引擎索引使用的是B+Tree

MyISAM儲存引擎
MyISAM儲存引擎不支援事務、表鎖設計,支援全文索引。在mysql 5.5.8版本之前,MyISAM是預設的儲存引擎。

1、MyISAM 這種儲存引擎不支援事務,不支援行級鎖,只支援併發插入的表鎖,主要用於高負載的select。

2、MyISAM儲存引擎的緩衝池只快取索引檔案,而不緩衝資料檔案。

3、MyISAM 型別的表支援三種不同的儲存結構:靜態型、動態型、壓縮型。

(1)靜態型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的資料型別),這樣mysql就會自動使用靜態myisam格式。

使用靜態格式的表的效能比較高,因為在維護和訪問的時候以預定格式儲存資料時需要的開銷很低。但是這高效能是有空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,佔據了整個空間。

(2)動態型:如果列(即使只有一列)定義為動態的(xblob, xtext, varchar等資料型別),這時myisam就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了效能的降低,因為如果某個欄位的內容發生改變則其位置很可能需要移動,這樣就會導致碎片的產生。隨著資料變化的怎多,碎片就會增加,資料訪問效能就會相應的降低。

對於因為碎片的原因而降低資料訪問性,有兩種解決辦法:
@1、儘可能使用靜態資料型別
@2、經常使用optimize table語句,他會整理表的碎片,恢復由於表的更新和刪除導致的空間丟失。

(如果儲存引擎不支援 optimize table , 則可以轉儲並重新載入資料,這樣也可以減少碎片)

(3)壓縮型:如果在這個資料庫中建立的是在整個生命週期內只讀的表,則這種情況就是用myisam的壓縮型表來減少空間的佔用。

3、MyISAM也是使用B+tree索引但是和Innodb的在具體實現上有些不同。

MEMORY儲存引擎

(1)memory儲存引擎相比前面的一些儲存引擎,有點不一樣,其使用儲存在記憶體中的資料來建立表,而且所有的資料也都儲存在記憶體中

(2)每個基於memory儲存引擎的表實際對應一個磁碟檔案,該檔案的檔名和表名是相同的,型別為.frm。該檔案只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於對資料的快速處理,提高整個表的處理能力。

(3)memory儲存引擎預設使用雜湊(HASH)索引,其速度比使用B-+Tree型要快,如果讀者希望使用B樹型,則在建立的時候可以引用。

(4)memory儲存引擎檔案資料都儲存在記憶體中,如果mysql程序發生異常,重啟或關閉機器這些資料都會消失。所以memory儲存引擎中的表的生命週期很短,一般只使用一次。

4.各儲存引擎相互轉化

1、alter table tablename engine = INnodb /MyISAM/Memory // 修改了這個表的儲存引擎

優點:簡單,而且適合所有的引擎。
缺點:(1)、這種轉化方式需要大量的時間 和I/O,mysql要執行從舊錶 到新表的一行一行的複製所以效率比較低
(2)、在轉化這期間源表加了讀鎖
(3)、從一種引擎到另一種引擎做錶轉化,所有屬於原始引擎的專用特性都會丟失,比如從innodb到 myisam 則 innodb的索引會丟失!

2、使用dump(轉出) import(匯入)

優點:使用mysql dump這個工具將修改的資料匯出後會以 .sql 的檔案儲存,你可以對這個檔案進行操作,所以你有更多更好的控制, 如修改表名,修改儲存引擎等!

3、第一種方式簡便,第二種方式安全,這第三種方式就算是前兩種方式的折中吧, create select:
(1)、 create table newtable like oldtable;
(2)、alter table newtable engine= innodb/ myisam / memory
(3)、insert into newtable select * from oldtable;
如果資料量不大的話這種方式還是挺好的!

還有更高效的辦法就是 增量填充,在填充完每個增量資料塊之後提交一次事務,這樣就不會導致撤銷日誌檔案過大;
(1)start transaction
(2)insert into newtable select * from oldtable where id(主鍵) between x and y;
(3) commit
這樣等資料填充之後有了需要的新表,舊錶也存在,不需要的可以刪除,很方便!