天天看點

MySQL資料庫常見存儲引擎(一)

  熟悉mysql資料庫的朋友,肯定會喜歡mysql強大的插件式存儲引擎,能夠支援太多存儲引擎,當目前的存儲引擎不能滿足你的需求時,你可以根據自己的需求選擇合适的引擎,将相關的檔案拷貝到相關路徑,甚至不需要重新開機資料庫,就可以使用。真的很強大。

1 常見存儲引擎

memory存儲引擎  

    硬碟上存儲表結構資訊,格式為.frm,資料存儲在記憶體中

    不支援blob text等格式

    建立表結構,

    支援表鎖

    支援B樹索引和哈希索引

    支援資料緩存 資料 緩存

    插入速度快

    配置設定給memory引擎表的記憶體不會釋放,由該表持有,删除資料也不會被回收,會被新插入資料使用

CSV存儲引擎

    所有列必須制定為Not NULL

    CSV 引擎不支援索引 不支援分區

    檔案格式 .frm  表結構資訊

    .CSV 則是資料檔案 是實際的資料

    .CSM 報錯表的狀态和表中的資料

    可以直接更改.csv檔案 更改資料, check  table 檢查   repair table  (注:在手動更改.csv檔案後 可以使用 repair table 加載資料)

例如:

    注意事項:check語句會檢查CSV檔案的分隔符是否正确,資料列和定義的表結構是否相同,發現不合法的行會抛出異常,在使用修複時,會嘗試從目前的CSV檔案中複制合法資料,清楚不合法資料,但是需要注意 修複時發現檔案中有損壞的記錄行,那麼後面的資料全部丢失,不管是否合法。

ARCHIVE 存儲引擎

     适用場景 歸檔

    支援大量資料壓縮 插入的列會被壓縮,ARCHIVE 引擎使用Zlib無損資料壓縮算法

    還可以使用optimze table  分析表并打包成更小的格式

    僅支援insert、update語句而不支援delete  replace update truncate 等語句 能支援order by操作 blob列類型

    支援行級鎖  但是不支援索引

    archive 引擎表檔案.frm定義檔案  .arz的資料檔案,執行優化操作時可能還會還會出現一個擴充名的.arn檔案。

簡單測試:

   先建立一個myisam存儲引擎的表,插入資料,然後建立ARCHIVE 存儲引擎的表插入資料,檢查其存儲空間的大小。

   對比結果相差8倍的存儲值,差距還是很大。

BLACKGOLE存儲引擎

    是一個比較特殊的存儲引擎,隻管寫入,但不管存儲,盡管能像其他存儲引擎一樣接受資料,但是所有資料都不會儲存,BLACKGOLE存儲引擎永遠為空,有點類似Linux下的/dev/null。

    多次測試,結果就是那麼神奇,插入都是成功的,但就是找不到資料,這個存儲引擎神奇吧,看看這個神奇的存儲引擎有哪些用途呢??

1、盡管BLACKHOLE存儲引擎不會儲存資料,但是啟用binlog,那麼執行得SQL語句還是實際上被記錄,也就是說能複制到SLAVE端。如下圖:

MySQL資料庫常見存儲引擎(一)

  結合複制特性中的replicete-do-* 或者reolicate-ignore-*規則,可以實作對日志的過濾,通過這一巧妙的設計,就可以實作相同的寫入,但是主從間的資料不一緻。

  BLACKHOLE對象中的insert觸發器會按照标準觸發,不過由于BLACKHOLE對象是空,那麼UPdate和delete絕對不可能觸發,對于觸發器中FOR  EACH RAW語句并不會有任何影響。

其他應用情形:

其他應用:

    驗證dump檔案文法

    通過對比啟動一級禁用二進制日志檔案時的性能,來評估二進制日志對負載的影響。

    BLACKHOLE存儲引擎 支援事務,送出事務會寫入二進制日志 但復原則不會

    BLACKHOLE存儲引擎與自增列

    BLACKHOLE引擎是no-op無操作引擎,所有在BLACKHOLE對象上的操作是沒有效果的,那麼久需要考慮主見自增列的行為,該引擎不會自動增加自增列值,實際上也不會儲存自增字段的狀态,對于複制來說,這一點很重要。

考慮以下複制場景

1、Master端BLACKHOLE表擁有一個自增的主鍵列

2、Slave端表存儲引擎為Myisam

3、Master端對該表對象的插入操作沒有明确知道自增列的列值

    該場景下 Slave端就會出現主鍵列的重複鍵錯誤,再給予語句的複制(SBR)模式下,每次插入事件的INSERT_ID都是相同的,是以複制就會觸發插入重複鍵的錯誤。

    在基于行的複制模式下,該引擎傳回的列值總是相同的,那麼在Slave端就會出現嘗試插入相同值的錯誤。

  MySQL的插件式存儲引擎是功能很豐富的,同樣也是适用于不用的應用情景,當你深入了解其原理後,才能發揮出MySQL更好的性能。