聊一聊MySQL的儲存引擎

KunlunDB 發表於 2022-01-24
MySQL
一、前言


儲存引擎(storage engine)是MySQL的專用稱呼,資料庫行業老大哥Oracle,以及SQL Server,PostgreSQL等都沒有儲存引擎的說法。

MySQL區別於其他資料庫的重要特點就是,其外掛式(pluggable)的表儲存引擎。


引擎(engine)是外來音譯詞,習慣上認為是發動機,好像和資料庫搭不上關係。

最早MySQL的儲存引擎稱為“資料表處理器”,可能是聽起來太老土,後來才改成高大上的儲存引擎。


儲存引擎的功能是接收上層傳下來的指令,然後對錶中的資料進行讀取或寫入的操作。 提醒一下,儲存引擎操作的物件是表(table),而不是資料庫(database)。


MySQL5.5版本之後開始採用InnoDB為預設儲存引擎,之前版本預設的儲存引擎為MyISAM。

我們來看一下MySQL8.0支援哪些儲存引擎:

    聊一聊MySQL的儲存引擎


    可以看到MySQL8.0支援9種儲存引擎,預設使用InnoDB,而且只有InnoDB支援事務(Transactions)和分散式事務(XA),儲存點(Savepoints)就是事務回滾所需要的功能。

    崑崙分散式資料庫實現的是分散式資料庫叢集的功能,使用的是InnoDB儲存引擎。
     
     
    二、各種儲存引擎的特徵介紹


    2.1 Federated

    Federated儲存引擎,提供了訪問遠端MySQL資料庫伺服器上表的方法,本地並不存放資料,資料全部放到遠端伺服器上,本地需要儲存表的結構和遠端伺服器的連線資訊。


    2.2 Memory


    Memory儲存引擎,也稱HEAP儲存引擎,資料儲存在記憶體中,表結構儲存在磁碟上。

    如果資料庫重啟或者發生崩潰,表中的資料都將消失。非常適用於儲存臨時資料的臨時表。其資料只儲存於記憶體中,讀寫當然非常快,但使用時要考慮記憶體消耗。


    2.3 Performance_schema

    Performance_schema儲存引擎,是MySQL資料庫系統專用引擎,使用者不能建立這種儲存引擎的表。

    系統預設資料庫performance_schema中的表就是採用這種儲存引擎。資料庫performanceschema用於監控MySQL在一個較低階別的執行過程中的資源消耗、資源等待等情況。


    2.4 Blackhole


    Blackhole儲存引擎,充當一個“黑洞”,接受資料,但將其扔掉,不儲存資料,類似於Linux系統中的/dev/null檔案。

    這麼特別的黑洞儲存引擎,主要作用在於:Replication場景實現中繼或過濾,驗證轉儲檔案語法,測量開啟binlog日誌所帶來的額外開銷,查詢和儲存引擎無關的其他方面的效能瓶頸。


    2.5 CSV

    CSV儲存引擎, 會在MySQL安裝目錄data資料夾中,和該表所在資料庫名相同的目錄生成一個 .CSV 檔案, 它可以將CSV型別的檔案當做表進行處理,相比其他儲存引擎的檔案內容,可以直接檢視和編輯。


    2.6 Archive

    Archive儲存引擎,僅僅支援最基本的插入(insert)和查詢(select)兩種功能。Archive擁有很好的壓縮機制,比MyISAM、InnoDB儲存引擎更加節約儲存空間。

    可以用於:日誌記錄,打卡記錄,天氣資訊記錄等不需要資料更新的場景。


    2.7 MyISAM

    MyISAM儲存引擎,是MySQL早期預設的儲存引擎, 擁有較高的插入、查詢速度,表鎖設計,支援全文索引,但不支援事務和外來鍵。

    如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。


    2.8 MRG_MyISAM

    MRG_MyISAM儲存引擎,是一組MyISAM的組合,也就是說,他將MyISAM引擎的多個表聚合起來,但是他的內部沒有資料,真正的資料依然是MyISAM引擎的表中,但是可以直接進行查詢、刪除更新等操作。


    2.9 InnoDB

    InnoDB儲存引擎,是MySQL當前版本預設的儲存引擎,支援事務安全表(ACID),支援行鎖定和外來鍵。

    由於其支援事務處理、外來鍵、支援崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高,要求實現併發控制,需要頻繁的更新、刪除操作的資料庫,那選擇InnoDB有很大的優勢



    三、測試對比MyISAM和InnoDB不同場景下的差異


    測試環境,機械硬碟的centos8虛擬機器,MySQL最新版本8.26,mariadb客戶端連結庫。
     
    建立儲存引擎分別為MyISAM和InnoDB的兩個表:

      聊一聊MySQL的儲存引擎

      聊一聊MySQL的儲存引擎


      3.1 插入對比

        聊一聊MySQL的儲存引擎

        耗時分別為:15秒(MyISAM),39秒(InnoDB)。
         
        3.2 普通鍵值查詢對比

          聊一聊MySQL的儲存引擎

          耗時分別為:140秒(MyISAM),23秒(InnoDB)。
           
          3.3 主鍵索引查詢對比

          將上一步的查詢語句改成按主鍵索引查詢

            聊一聊MySQL的儲存引擎

            耗時分別為:1.25秒(MyISAM),1.30秒(InnoDB)。
             
            3.4 更新對比

              聊一聊MySQL的儲存引擎

              耗時分別為:15秒(MyISAM),44秒(InnoDB)。
               
              3.5 刪除對比     

                聊一聊MySQL的儲存引擎

                耗時分別為:14秒(MyISAM),45秒(InnoDB)。

                綜合測試結果,MyISAM普通查詢速度對比InnoDB慢了很多,其他測試效能都比InnoDB好,當然這是在沒有事務的場景下做的測試,筆者的測試例項比較簡單,只能作為參考,不能代表實際的應用場景。



                KunlunDB專案已開源

                【GitHub:】


                【Gitee:】


                END


                來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011764/viewspace-2853742/,如需轉載,請註明出處,否則將追究法律責任。