【轉載】如何選擇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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...