MySQL 存儲引擎詳解
概述
MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
類型
MyISAM
特點
- 不支持事務
- 不支持外鍵
- 查詢、插入效率高
存儲結構
每個MyISAM 存儲引擎的表在磁盤上存儲成3個文件
- TABLE_NAME.frm - 存儲表定義
- TABLE_NAME.MYD - (MyData) - 存儲數據
- TABLE_NAME.MYI - 存儲索引
使用場景
- 系統中的地區表
- 系統中的常量表
- 系統中的開關狀態表
- 其它對事務沒有要求的場景
表級鎖的鎖模式
表共享讀鎖和表獨佔寫鎖MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖。
表共享讀鎖
對MyISAM表的讀操作(加讀鎖),不會阻塞其他進程對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,纔會執行其它進程的寫操作。
表獨佔寫鎖
對MyISAM表的寫操作(加寫鎖),會阻塞其他進程對同一表的讀和寫操作,只有當寫鎖釋放後,纔會執行其它進程的讀寫操作。
優化
併發支持
修改 /etc/my.cnf 文件
- concurrent_insert
在MyISAM裏讀寫操作是串行的,但當對同一個表進行查詢和插入操作時,爲了降低鎖競爭的頻率,根據concurrent_insert的設置,MyISAM是可以並行處理查詢和插入的- concurrent_insert = 0
不允許併發插入功能 - concurrent_insert = 1 (缺省)
允許對沒有洞洞的表使用併發插入,新增的數據位於數據文件結尾 - concurrent_insert = 2 (推薦配置)
允許在數據文件結尾併發插入
- concurrent_insert = 0
- max_write_lock_count
缺省情況下,寫操作的優先級要高於讀操作的優先級,即便是先發送的讀請求,後發送的寫請求,此時也會優先處理寫請求,然後再處理讀請求。這就造成一 個問題:一旦我發出若干個寫請求,就會堵塞所有的讀請求,直到寫請求全都處理完,纔有機會處理讀請求- max_write_lock_count = 1
當系統處理一個寫操作後,就會暫停寫操作,給讀操作執行的機會
- max_write_lock_count = 1
- 以下配置同時作用在 Memory 存儲引擎的表
示例配置:low_priority_update = 1 降低修改操作的優先級- low_priority
應用於DELETE、INSERT、LOAD DATA、REPLACE和UPDATE - high_priority
應用於SELECT和INSERT語句 - delayed
應用於INSERT和REPLACE語句
- low_priority
SQL優化
- DELAYED (異步insert )
INSERT DELAYED INTO ENT_MENU (ID, `NAME`, SORT_NUM) VALUES (115, 'asfd', 3)
- 優點:
- 不需要等待新增成功, 服務器會直接返回一個 成功
- 缺點:
- 通過 MySQL服務端的隊列實現,如果服務不可用會存在丟失數據的風險
- 不能返回自增長的ID
- 優點:
InnoDB
5.5版本後Mysql的默認數據庫,事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定
事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定。InnoDB是爲處理巨大數據量時的最大性能設計。InnoDB存儲引擎完全與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它自己的緩衝池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制爲2GB的操作系統上。InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成爲Windows上MySQL的默認表。
InnoDB 給 MySQL 提供了具有事務(transaction)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)、多版本併發控制(multi-versioned concurrency control)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行級鎖(locking on row level),提供與 Oracle 類似的不加鎖讀取(non-locking read in SELECTs)。InnoDB鎖定在行級並且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因爲在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。這些特性均提高了多用戶併發操作的性能表現。在InnoDB表中不需要擴大鎖定(lock escalation),因爲 InnoDB 的行級鎖定(row level locks)適宜非常小的空間。InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。
在技術上,InnoDB 是一套放在 MySQL後臺的完整數據庫系統,InnoDB 在主內存中建立其專用的緩衝池用於高速緩衝數據和索引。
InnoDB 把數據和索引存放在表空間裏,可能包含多個文件,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小隻受限於操作系統的文件大小,可也可以每個表使用各自獨立的表空間,只需要啓用選項 innodb_file_per_table。
特點
- 支持ACID事務
- 支持行級鎖定
- InnoDB存儲引擎完全與MySQL服務器整合
- 有自己的緩衝池
- 表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)
- 提供與 Oracle 類似的不加鎖讀取
- 提供外鍵約束
- 只有通過索引條件檢索數據,innodb纔會使用行級鎖,否則會使用表鎖
存儲結構
每個InnoDB的表在硬盤上存儲成2類文件
- .frm - 存儲表定義 - 只有一個
- .idb - 存儲數據信息和索引信息 - 可能有多個
使用場景
- 需要事務支持
- 高併發場景
鎖模式
BDB
源自Berkeley DB,事務型數據庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性
Memory
所有數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會佔用和數據量成正比的內存空間。並且其內容會在Mysql重新啓動時丟失
Merge
將一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用
Archive
非常適合存儲大量的獨立的,作爲歷史記錄的數據。因爲它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差
Federated
將不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分佈式應用
Cluster/NDB
高冗餘的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
CSV
邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏爲每個數據表創建一個.CSV文件。這是一種普通文本文件,每個數據行佔用一個文本行。CSV存儲引擎不支持索引。
BlackHole
黑洞引擎,寫入的任何數據都會消失,一般用於記錄binlog做複製的中繼