MySQL的存儲引擎整理

来源:http://www.cnblogs.com/liym/archive/2016/09/02/5832201.html
-Advertisement-
Play Games

01.MyISAM 01.MyISAM MySQL 5.0 以前的預設存儲引擎。MyISAM 不支持事務、也不支持外鍵,其優勢是訪問的速度快,對事務完整性沒有要求或者以SELECT、INSERT 為主的應用基本上都可以使用這個引擎來創建表。 每個MyISAM 在磁碟上存儲成3 個文件,其文件名都和表 ...


01.MyISAM MySQL 5.0 以前的預設存儲引擎。MyISAM 不支持事務、也不支持外鍵,其優勢是訪問的速度快,對事務完整性沒有要求或者以SELECT、INSERT 為主的應用基本上都可以使用這個引擎來創建表。 每個MyISAM 在磁碟上存儲成3 個文件,其文件名都和表名相同,但擴展名分別是:  .frm(存儲表定義);  .MYD(MYData,存儲數據);  .MYI (MYIndex,存儲索引)。 數據文件和索引文件可以放置在不同的目錄,平均分佈IO,獲得更快的速度。  要指定索引文件和數據文件的路徑,需要在創建表的時候通過DATA DIRECTORY 和INDEX DIRECTORY 語句指定,也就是說不同MyISAM 表的索引文件和數據文件可以放置到不同的路徑下。文件路徑需要是絕對路徑,並且具有訪問許可權。 MyISAM 類型的表可能會損壞,原因可能是多種多樣的,損壞後的表可能不能訪問,會提示需要修複或者訪問後返回錯誤的結果。MyISAM 類型的表提供修複的工具,可以用CHECKTABLE 語句來檢查MyISAM 表的健康,並用REPAIR TABLE 語句修複一個損壞的MyISAM 表。表損壞可能導致資料庫異常重新啟動,需要儘快修複並儘可能地確認損壞的原因。 MyISAM 的表又支持3 種不同的存儲格式,分別是:  靜態(固定長度)表;  動態表;  壓縮表。 其中,靜態表是預設的存儲格式。靜態表中的欄位都是非變長欄位,這樣每個記錄都是固定長度的,這種存儲方式的優點是存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多。靜態表的數據在存儲的時候會按照列的寬度定義補足空格,但是在應用訪問的時候並不會得到這些空格,這些空格在返回給應用之前已經去掉。 動態表中包含變長欄位,記錄不是固定長度的,這樣存儲的優點是占用的空間相對較少,但是頻繁地更新刪除記錄會產生碎片,需要定期執行OPTIMIZE TABLE 語句或myisamchk -r 命令來改善性能,並且出現故障的時候恢復相對比較困難。 壓縮表由myisampack 工具創建,占據非常小的磁碟空間。因為每個記錄是被單獨壓縮的,所以只有非常小的訪問開支。     02.InnoDB MySQL 5.0開始的預設引擎,InnoDB 存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM的存儲引擎,InnoDB 寫的處理效率差一些並且會占用更多的磁碟空間以保留數據和索引。 AUTO_INCREMENT InnoDB 表的自動增長列可以手工插入,但是插入的值如果是空或者0,則實際插入的將是自動增長後的值。 可以通過“ALTER TABLE *** AUTO_INCREMENT = n;”語句強制設置自動增長列的初識值,預設從1 開始,但是該強制的預設值是保留在記憶體中的,如果該值在使用之前資料庫重新啟動,那麼這個強制的預設值就會丟失,就需要在資料庫啟動以後重新設置。 可以使用LAST_INSERT_ID()查詢當前線程最後插入記錄使用的值。如果一次插入了多條記錄,那麼返回的是第一條記錄使用的自動增長值。 對於InnoDB 表,自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列,但是對於MyISAM 表,自動增長列可以是組合索引的其他列,這樣插入記錄後,自動增長列是按照組合索引的前面幾列進行排序後遞增的。 例如,創建一個新的MyISAM 類型的表autoincre_demo,自動增長列d1 作為組合索引的第二列,對該表插入一些記錄後,可以發現自動增長列是按照組合索引的第一列d2 進行排序後遞增的: 外鍵約束 MySQL 支持外鍵的存儲引擎只有InnoDB,在創建外鍵的時候,要求父表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引 創建索引的時候,可以指定在刪除、更新父表時,對子表進行的相應操作,包括RESTRICT、CASCADE、SET NULL 和NO ACTION。其中RESTRICT 和NO ACTION 相同,是指限制在子表有關聯記錄的情況下父表不能更新;CASCADE 表示父表在更新或者刪除時,更新或者刪除子表對應記錄;SET NULL 則表示父表在更新或者刪除的時候,子表的對應欄位被SET NULL。選擇後兩種方式的時候要謹慎,可能會因為錯誤的操作導致數據的丟失。子表的外鍵指定是ON DELETE RESTRICT ON UPDATE CASCADE方式的,那麼在主表刪除記錄的時候,如果子表有對應記錄,則不允許刪除,主表在更新記錄的時候,如果子表有對應記錄,則子表對應更新。 當某個表被其他表創建了外鍵參照,那麼該表的對應索引或者主鍵禁止被刪除。 在導入多個表的數據時,如果需要忽略表之前的導入順序,可以暫時關閉外鍵的檢查;同樣,在執行LOAD DATA 和ALTER TABLE 操作的時候,可以通過暫時關閉外鍵約束來加快處理的速度,關閉的命令是“SET FOREIGN_KEY_CHECKS = 0;”,執行完成之後,通過執行“SET FOREIGN_KEY_CHECKS = 1;”語句改回原狀態。 存儲方式 InnoDB 存儲表和索引有以下兩種方式。  使用共用表空間存儲,這種方式創建的表的表結構保存在.frm 文件中,數據和索引保存在innodb_data_home_dir 和innodb_data_file_path 定義的表空間中,可以是多個文件。  使用多表空間存儲,這種方式創建的表的表結構仍然保存在.frm 文件中,但是每個表的數據和索引單獨保存在.ibd 中。如果是個分區表,則每個分區對應單獨的.ibd文件,文件名是“表名+分區名”,可以在創建分區的時候指定每個分區的數據文件的位置,以此來將表的IO 均勻分佈在多個磁碟上。 要使用多表空間的存儲方式,需要設置參數innodb_file_per_table,並重新啟動服務後才可以生效,對於新建的表按照多表空間的方式創建,已有的表仍然使用共用表空間存儲。如果將已有的多表空間方式修改回共用表空間的方式,則新建表會在共用表空間中創建,但已有的多表空間的表仍然保存原來的訪問方式。所以多表空間的參數生效後,只對新建的表生效。 多表空間的數據文件沒有大小限制,不需要設置初始大小,也不需要設置文件的最大限制、擴展大小等參數。對於使用多表空間特性的表,可以比較方便地進行單表備份和恢復操作,但是直接複製.ibd 文件是不行的,因為沒有共用表空間的數據字典信息,直接複製的.ibd 文件和.frm 文件恢復時是不能被正確識別的,但可以通過以下命令:
  1. 1 ALTER TABLE tbl_name DISCARD TABLESPACE;
    2 ALTER TABLE tbl_name IMPORT TABLESPACE;

     

將備份恢復到資料庫中,但是這樣的單表備份,只能恢復到表原來在的資料庫中,而不能恢復到其他的資料庫中。如果要將單表恢復到目標資料庫,則需要通過mysqldump 和mysqlimport 來實現。 註意:即便在多表空間的存儲方式下,共用表空間仍然是必須的,InnoDB 把內部數據詞典和未作日誌放在這個文件中。     03.MEMORY MEMORY 存儲引擎使用存在記憶體中的內容來創建表。每個MEMORY 表只實際對應一個磁碟文件,格式是.frm。MEMORY 類型的表訪問非常得快,因為它的數據是放在記憶體中的,並且預設使用HASH 索引,但是一旦服務關閉,表中的數據就會丟失掉。   給MEMORY 表創建索引的時候,可以指定使用HASH 索引還是BTREE 索引: 在啟動MySQL 服務的時候使用--init-file 選項,把INSERT INTO ... SELECT 或LOAD DATA INFILE 這樣的語句放入這個文件中,就可以在服務啟動時從持久穩固的數據源裝載表。 伺服器需要足夠記憶體來維持所有在同一時間使用的MEMORY 表,當不再需要MEMORY表的內容之時,要釋放被MEMORY 表使用的記憶體,應該執行DELETE FROM 或TRUNCATE TABLE,或者整個地刪除表(使用DROP TABLE 操作)。 每個MEMORY 表中可以放置的數據量的大小,受到max_heap_table_size 系統變數的約束,這個系統變數的初始值是16MB,可以按照需要加大。此外,在定義MEMORY 表的時候,可以通過MAX_ROWS 子句指定表的最大行數。 MEMORY 類型的存儲引擎主要用在那些內容變化不頻繁的代碼表,或者作為統計操作的中間結果表,便於高效地對中間結果進行分析並得到最終的統計結果。對MEMORY 存儲引擎的表進行更新操作要謹慎,因為數據並沒有實際寫入到磁碟中,所以一定要對下次重新啟動服務後如何獲得這些修改後的數據有所考慮。     04.MERGE MERGE 存儲引擎是一組MyISAM 表的組合,這些MyISAM 表必須結構完全相同,MERGE表本身並沒有數據,對MERGE 類型的表可以進行查詢、更新、刪除的操作,這些操作實際上是對內部的實際的MyISAM 表進行的。對於MERGE 類型表的插入操作,是通過INSERT_METHOD 子句定義插入的表,可以有3 個不同的值,使用FIRST 或LAST 值使得插入操作被相應地作用在第一或最後一個表上,不定義這個子句或者定義為NO,表示不能對這 個MERGE 表執行插入操作。 可以對MERGE 表進行DROP 操作,這個操作只是刪除MERGE 的定義,對內部的表沒有任何的影響。 MERGE 表在磁碟上保留兩個文件,文件名以表的名字開始,一個.frm 文件存儲表定義,另一個.MRG 文件包含組合表的信息,包括MERGE 表由哪些表組成、插入新的數據時的依據。可以通過修改.MRG 文件來修改MERGE 表,但是修改後要通過FLUSH TABLES 刷新。 可以發現,payment_all 表中的數據是payment_2006 和payment_2007 表的記錄合併後的結果集。 下麵向MERGE 表插入一條記錄,由於MERGE 表的定義是INSERT_METHOD=LAST,就會向最後一個表中插入記錄,所以雖然這裡插入的記錄是2006 年的,但仍然會寫到payment_2007表中。 這也是MERGE 表和分區表的區別,MERGE 表並不能智能地將記錄寫到對應的表中,而分區表是可以的。通常我們使用MERGE 表來透明地對多個表進行查詢和更新操作,而對這種按照時間記錄的操作日誌表則可以透明地進行插入操作。     05.如何選擇存儲引擎  MyISAM:預設的MySQL 插件式存儲引擎。如果應用是以讀操作和插入操作為主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇這個存儲引擎是非常適合的。MyISAM 是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。  InnoDB:用於事務處理應用程式,支持外鍵。如果應用對事務的完整性有比較高的要求,在併發條件下要求數據的一致性,數據操作除了插入和查詢以外,還包括很多的更新、刪除操作,那麼InnoDB 存儲引擎應該是比較合適的選擇。InnoDB 存儲引擎除了有效地降低由於刪除和更新導致的鎖定,還可以確保事務的完整提交(Commit)和回滾(Rollback),對於類似計費系統或者財務系統等對數據準確性要求比較高的系統,InnoDB 都是合適的選擇。  MEMORY:將所有數據保存在RAM 中,在需要快速定位記錄和其他類似數據的環境下,可提供極快的訪問。MEMORY 的缺陷是對錶的大小有限制,太大的表無法CACHE 在記憶體中,其次是要確保表的數據可以恢復,資料庫異常終止後表中的數據是可以恢復的。MEMORY 表通常用於更新不太頻繁的小表,用以快速得到訪問結果。  MERGE:用於將一系列等同的MyISAM 表以邏輯方式組合在一起,並作為一個對象引用它們。MERGE 表的優點在於可以突破對單個MyISAM 表大小的限制,並且通過將不同的表分佈在多個磁碟上,可以有效地改善MERGE表的訪問效率。這對於諸如數據倉儲等VLDB環境十分適合。 註意:以上只是我們按照實施經驗提出的關於存儲引擎選擇的一些建議,但是不同應用的特點是千差萬別的,選擇使用哪種存儲引擎才是最佳方案也不是絕對的,這需要根據用戶各自的應用進行測試,從而得到最適合自己的結果。  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 官方網址:http://snapkit.io/ Github: https://github.com/SnapKit/SnapKit SnapKit is a DSL to make Auto Layout easy on both iOS and OS X. Simple & Expressive ...
  • 一、項目需求 用collectionView展示很多照片,點擊某個照片,用全屏scrollView無限迴圈的方式查看圖片。點擊放大的圖片,圖片縮小到原先的尺寸。 如圖gif1.gif所示,點擊中間的圖片,放大圖片,滑動圖片。再點擊大圖,圖片回到相應的位置。 gif1.gif gif1.gif 如圖g ...
  • Masonry介紹 Masonry是一個輕量級的佈局框架 擁有自己的描述語法 採用更優雅的鏈式語法封裝自動佈局 簡潔明瞭 並具有高可讀性 而且同時支持 iOS 和 Max OS X。可以通過cocoapods將其導入。 Masonry使用 Masonry屬性及其說明 其中leading與left t ...
  • 這篇文章會非常詳細的分析 iOS 界面構建中的各種性能問題以及對應的解決思路,同時給出一個開源的微博列表實現,通過實際的代碼展示如何構建流暢的交互。 Index演示項目屏幕顯示圖像的原理卡頓產生的原因和解決方案CPU 資源消耗原因和解決方案GPU 資源消耗原因和解決方案AsyncDisplayKit ...
  • Android Weekly Issue #220, 中文筆記. ...
  • 如果你都是按照預設配置安裝的那麼只要按照如下步驟就可以了 1、cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 將服務文件拷貝到init.d下,並重命名為mysql 2、chmod +x /etc/init.d/mysq ...
  • 在SQL Server中,需要對數據操作進行先SELECT 之後UPDATE,對於這樣的操作,如果出現高併發,可能導致臟讀情況的發生。不能保證數據的同步。 解決方案是在事物中對錶進行加更新鎖: 事務一: 事務二: ...
  • 經典的關聯規則挖掘演算法Apriori和FP-growth,在大數據或者海量數據面前,由於候選集和生成的FP樹大而無法存儲到記憶體,同時也由於演算法本身單機的特點,決定了它串列處理數據的方式,這在效率上很難滿足大數據處理的要求,數據遷移到平臺需要傳輸和轉儲,在大數據面前,也是一大難題。 一般而言"關聯規則 ...
一周排行
    -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# ...