【轉載】如何選擇MySQL存儲引擎

来源:http://www.cnblogs.com/xujishou/archive/2017/01/23/6343431.html
-Advertisement-
Play Games

一、MySQL的存儲引擎 完整的引擎說明還是看官方文檔:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 這裡介紹一些主要的引擎 1、InnoDB存儲引擎 InnoDB是MySQL的預設事務型引擎,它被設計用來處理大量的短期(sh ...


一、MySQL的存儲引擎

完整的引擎說明還是看官方文檔:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html

這裡介紹一些主要的引擎

 

1、InnoDB存儲引擎

InnoDB是MySQL的預設事務型引擎,它被設計用來處理大量的短期(short-lived)事務。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。

建議使用MySQL5.5及以後的版本,因為這個版本及以後的版本的InnoDB引擎性能更好。

MySQL4.1以後的版本中,InnoDB可以將每個表的數據和索引存放在單獨的文件中。這樣在複製備份崩潰恢復等操作中有明顯優勢。可以通過在my.cnf中增加innodb_file_per_table來開啟這個功能。如下:

Cnf代碼  收藏代碼
  1. [mysqld]  
  2. innodb_file_per_table  

 

InnoDB採用MVCC來支持高併發,並且實現了四個標準的隔離級別。其預設級別是REPEATABLE READ(可重覆讀),並且通過間隙鎖(next-key locking)策略防止幻讀的出現。(事務和事務隔離級別是另一個大題目,各自網補吧)。

 

InnoDB是基於聚簇索引建立的,聚簇索引對主鍵查詢有很高的性能。不過它的二級索引(secondary index,非主鍵索引)中必須包含主鍵列,所以如果主鍵列很大的話,其他的所有索引都會很大。因此表上的索引較多的話,主鍵應當儘可能的小。

 

InnoDB的存儲格式是平臺獨立的,可以將數據和索引文件從Intel平臺複製到Sun SPARC平臺或其他平臺。

 

InnoDB通過一些機制和工具支持真正的熱備份,MySQL的其他存儲引擎不支持熱備份。

 

2、MyISAM存儲引擎

MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM不支持事務和行級鎖,有一個毫無疑問的缺陷就是崩潰後無法安全恢復。

 

MyISAM會將表存儲在兩個文件在中:數據文件和索引文件,分別是.MYD和.MYI為擴展名。

在MySQL5.0以前,只能處理4G的數據,5.0中可以處理256T的數據。

 

在數據不再進行修改操作時,可以對MyISAM表進行壓縮,壓縮後可以提高讀能力,原因是減少了磁碟I/O。

 

3、Archive引擎

Archive存儲引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。

Archive表適合日誌和數據採集類應用。

Archive引擎支持行級鎖和專用的緩存區,所以可以實現高併發的插入,但它不是一個事物型的引擎,而是一個針對高速插入和壓縮做了優化的簡單引擎。

 

4、Blackhole引擎

Blackhole引擎沒有實現任何存儲機制,它會丟棄所有插入的數據,不做任何保存。但伺服器會記錄Blackhole表的日誌,所以可以用於複製數據到備庫,或者簡單地記錄到日誌。但這種應用方式會碰到很多問題,因此並不推薦。

 

5、CSV引擎

CSV引擎可以將普通的SCV文件作為MySQL的表來處理,但不支持索引。

CSV引擎可以作為一種數據交換的機制,非常有用。

 

6、Federated引擎

Federated引擎是訪問其他MySQL伺服器的一個代理,儘管該引擎看起來提供了一種很好的跨伺服器的靈活性,但也經常帶來問題,因此預設是禁用的。

 

7、Memory引擎

如果需要快速地訪問數據,並且這些數據不會被修改,重啟以後丟失也沒有關係,那麼使用Memory表是非常有用。Memory表至少比MyISAM表要快一個數量級。

Memory表是表級鎖,因此併發寫入的性能較低。它不支持BLOB或TEXT類型的列,並且每行的長度是固定的,這可能呆滯部分記憶體的浪費。

臨時表和Memory表不是一回事。臨時表是指使用CREATE TEMPORARY TABLE語句創建的表,它可以使用任何存儲引擎,只在單個連接中可見,當連接斷開時,臨時表也將不復存在。

 

8、NDB集群引擎

MySQL伺服器、NDB集群存儲引擎,以及分散式的、share-nothing的、容災的、高可用的NDB資料庫的組合,被稱為MySQL集群(MySQL Cluster)。

 

其他第三方或社區引擎

XtraDB:是InnoDB的一個改進版本,可以作為InnoDB的一個完美的替代產品。

TokuDB:使用了一種新的叫做分形樹(Fractal Trees)的索引數據結構。

Infobright:是最有名的面向列的存儲引擎。

Groonga:是一款全文索引引擎。

OQGraph:該引擎由Open Query研發,支持圖操作(比如查找兩點之間的最短路徑)。

Q4M:該引擎在MySQL內部實現了隊列操作。

SphinxSE:該引擎為Sphinx全文索引搜索伺服器提供了SQL介面。

 

二、選擇合適的引擎

大部分情況下,InnoDB都是正確的選擇,可以簡單地歸納為一句話“除非需要用到某些InnoDB不具備的特性,並且沒有其他辦法可以替代,否則都應該優先選擇InnoDB引擎”。

除非萬不得已,否則建議不要混合使用多種存儲引擎,否則可能帶來一系列負責的問題,以及一些潛在的bug和邊界問題。

如果應用需要不同的存儲引擎,請先考慮以下幾個因素:

事務:

    如果應用需要事務支持,那麼InnoDB(或者XtraDB)是目前最穩定並且經過驗證的選擇。

備份:

    如果可以定期地關閉伺服器來執行備份,那麼備份的因素可以忽略。反之,如果需要線上熱備份,那麼選擇InnoDB就是基本的要求。

崩潰恢復

    MyISAM崩潰後發生損壞的概率比InnoDB要高很多,而且恢復速度也要慢。

特有的特性

    如果一個存儲引擎擁有一些關鍵的特性,同時卻又缺乏一些必要的特性,那麼有時候不得不做折中的考慮,或者在架構設計上做一些取捨。

 

有些查詢SQL在不同的引擎上表現不同。比較典型的是:

SELECT COUNT(*) FROM table;

對於MyISAM確實會很快,但其他的可能都不行。

 

三、應用舉例

 

1、日誌型應用

MyISAM或者Archive存儲引擎對這類應用比較合適,因為他們開銷低,而且插入速度非常快。

如果需要對記錄的日誌做分析報表,生成報表的SQL很可能會導致插入效率明顯降低,這時候該怎麼辦?

一種解決方法,是利用MySQL內置的複製方案將數據複製一份到備庫,然後在備庫上執行比較消耗時間和CPU的查詢。當然也可以在系統負載較低的時候執行報表查詢操作,但應用在不斷變化,如果依賴這個策略可能以後會導致問題。

另一種方法,在日誌記錄表的名字中包含年和月的信息,這樣可以在已經沒有插入操作的歷史表上做頻繁的查詢操作,而不會幹擾到最新的當前表上的插入操作。

 

2、只讀或者大部分情況下只讀的表

有些表的數據用於編製類目或者分列清單(如工作崗位),這種應用場景是典型的讀多寫少的業務。如果不介意MyISAM的崩潰恢復問題,選用MyISAM引擎是合適的。(MyISAM只將數據寫到記憶體中,然後等待操作系統定期將數據刷出到磁碟上)

 

3、訂單處理

涉及訂單處理,支持事務是必要的,InnoDB是訂單處理類應用的最佳選擇。

 

4、大數據量

如果數據增長到10TB以上的級別,可能需要建立數據倉庫。Infobright是MySQL數據倉庫最成功的方案。也有一些大資料庫不適合Infobright,卻可能適合TokuDB。

 

下麵是常用存儲引擎的適用環境:

  1. MyISAM:預設的MySQL插件式存儲引擎,它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一
  2. InnoDB:用於事務處理應用程式,具有眾多特性,包括ACID事務支持。
  3. Memory:將所有數據保存在RAM中,在需要快速查找引用和其他類似數據的環境下,可提供極快的訪問。
  4. Merge:允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,並作為1個對象引用它們。對於諸如數據倉儲等VLDB環境十分適合。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天 安裝了 Android Studio 2.2。 本來一切都好,但是當我修改了 配置文件 studio64.exe.vmoptions 想修改 最大記憶體(保證運行流暢)後,AS 就再也運行不了了。 報錯內容大意是: error code -1,必須配置 JAVA_HOME 參數,而且這個參數 ...
  • 昨天測試開發微信小程式,才發現微信也要求用HTTPS加密數據,想來是由於之前蘋果的ATS審核政策的緣故吧,微信想在蘋果上開放小程式必然也只能要求開發者必須使用HTTPS了,於是在伺服器上測試安裝Nginx+HTTPS服務。 安裝 HTTPS 最麻煩的問題應該就是獲取證書了,證書感覺種類也挺複雜的,有 ...
  • 其實你已經知道了小程式的文件結構 上一節講到,小程式的頁面由三部分組成: 視圖(.wxml)、邏輯(.js)、樣式(.wxss)。 我們這次重新展開文件結構: 小程式用到的文件類型只有四種,正如你所看到的那樣。 可是我還是要展開說一下,但這裡就不做很細的分析了,直接說出結論: 根目錄的app.js、 ...
  • 16年年初跳槽到了一家做安全相關的公司,自從入職以來,就是解決各種難以想象難題,再也不能和小伙伴請教了,因為他們也覺得不可能嘛,每天都是沉浸在研究摸索和不確定中,最讓人難以接受的是研究了好幾天還是沒有結果,最快樂的是解決了一個小問題,總之2016就是個五味雜陳的一年。 剛來到這個公司是各種的問題擺在 ...
  • mybatis interceptor 處理查詢參數及查詢結果 ...
  • mysql執行sql可以通過設置mysql bin 日誌進行記錄查看,mysql bin日誌配置如下: log_bin:on log_bin_basename:bin文件路徑及名首碼(/var/log/mysql/mysql-bin) log_bin_index:bin文件index(/var/lo ...
  • 最近在看《Microsoft SQL Server2005技術內幕:T-SQL程式設計》 1、表變數的事務上下文中提到,表變數不受外部事務回滾影響。 舉個例子: DECLARE @TA TABLE(col INT);INSERT @TA VALUES(0);SELECT * FROM @TA;BEG ...
  • 首先明確PL/SQL主要作用作用: SQL語言適合管理關係型資料庫但是它無法滿足更複雜的數據處理,所以產生PLSQL。PLSQL用戶創建存儲過程、函數、觸發器、包及用戶自定義的函數。 特點: PLSQL具有高級語言所擁有的編程結構,使用PLSQL可以極大的提高資料庫編程的靈活性,PLSQL不是獨立存 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...