目錄
- 1.MySQL引擎概述
- 1.1.什么是存盤引擎?
- 1.2.MySQL存盤引擎的架構
- 2.查看MySQL支持的存盤引擎
- 3.MySQL5.6支持的存盤引擎
- 4.MySQL常用存盤引擎特性對比
- 5.設定與更改MySQL的引擎
- 5.1.設定表的引擎
- 5.2.更改表的引擎
- 5.2.1.利用SQL命令陳述句修改引擎
- 5.2.2.使用sed對備份的SQL檔案進行批量轉換
- 5.2.3.mysql_convert_table_format命令修改
- 6.MyISAM引擎
- 6.1.什么是MyISAM引擎
- 6.2.MyISAM引擎的存盤方式
- 6.3.MyISAM引擎的主要特點
- 6.4.MyISAM引擎適用的生產業務場景
- 7.InnoDB引擎
- 7.1.什么是InnoDB引擎
- 7.2.InnoDB引擎的存盤方式
- 7.3.InnoDB引擎的主要特點
- 7.4.InnoDB引擎適用的生產業務場景
- 7.5.InnoDB引擎相關引數介紹
- 7.6.InnoDB引擎調優的基本方法
- 8.Memory存盤引擎
- 9.ARCHIVE存盤引擎
- 10.NDB存盤引擎
1.MySQL引擎概述
1.1.什么是存盤引擎?
資料庫表里的資料存盤在資料庫里及磁盤上,它跟視頻格式及存盤磁盤檔案系統格式的特征類似,也有很多存盤方式,
但是,對于用戶和應用程式來說,同樣一張表的資料,無論采用什么引擎來存盤,用戶看到的資料都是一樣的,對于不同的引擎存取,引擎功能、占用的空間大小、讀取性能等可能都有區別,
存盤引擎是MySQL資料庫用來處理不同表型別的SQL操作的組件,
MySQL早期最常用的存盤引擎為:MyISAM和InnoDB,目前,InnoDB是最常用的存盤引擎,也是MySQL5.6默認的存盤引擎,
1.2.MySQL存盤引擎的架構
MySQL的存盤引擎是MySQL資料庫的重要組成部分,MySQL的每種存盤引擎在MySQL里都是通過插件的方式使用的,可以輕易地從MySQL中進行加載和卸載,MySQL中可以同時支持多種存盤引擎,
MySQL體系結構的組成部分:
1、連接池部分,
2、資料庫管理部分,
3、SQL介面、查詢分析器、優化器、快取緩沖,
4、存盤引擎部分,
5、資料庫資料檔案和各種日志檔案,
6、檔案系統磁盤,
2.查看MySQL支持的存盤引擎
可以在MySQL中使用顯示引擎的命令來得到一個可用引擎的串列:
select version();
show engines;
命令的結果顯示了資料庫可用引擎的全部名單,以及在當前的資料庫中是否支持這些引擎,其中前四列比較重要,第一列是引擎名字,第二列是當前資料庫是否支持,第三列是描述,第四串列示是否支持事務,
3.MySQL5.6支持的存盤引擎
| 存盤引擎 | 說明(帶*的為重點) |
|---|---|
| InnoDB | InnoDB是MySQL5.6默認的存盤引擎,InnoDB支持事務,具有提交、回滾的功能,并且可以通過崩潰恢復能力來保護用戶的資料,讀寫資料是行級鎖定,可提升多用戶并發訪問的能力,InnoDB以集群的索引方式存盤用戶資料,基于主鍵方式查詢可提高I/O性能,InnoDB也支持外鍵,使得資料更完整、更安全,* |
| MyISAM | MyISAM是MySQL5.5.5以前默認的存盤引擎,曾經用的很多,現在用的少了,MyISAM僅支持表級鎖,讀寫性能都很有限,可用于只讀或者絕大多數以讀為主的業務場景, |
| Memory | Memory以記憶體的方式存盤所有資料,訪問速度很快,不過其使用場景也是越來越少了,InnoDB的Buffer pool記憶體也可以快取絕大多數的資料了, |
| CSV | CSV這個引擎所對應的資料表格實際上是帶有逗號分隔值的文本檔案,CSV表格允許您以CSV格式匯入或者轉儲資料,以便于讀取和寫入相同格式的腳本,與應用程式進行資料交換,由于CSV表是沒有索引的,因此通常應在正常操作期間將資料保存在InnoDB表中,并且只能在匯入或匯出階段使用CSV表, |
| Archive | 這些緊湊、無索引的引擎表旨在存盤和檢索大量參考的歷史、歸檔或安全審核資訊, |
| Blackhole | Blackhole存盤引擎接受但不存盤資料,類似于Unix/dev/null設備,查詢總是會回傳一個空集,這些表可用于將DML陳述句發送到從屬服務器的復制配置,但是主服務器不保留其自己的資料副本, |
| Merge | 使MySQL DBA或開發人員能夠對一系列相同的MyISAM表進行邏輯分組,并將其作為一個物件參考,merge適用于資料倉庫等VLDB環境, |
| Federated | Federated可通過鏈接單獨的MySQL服務器以從許多物理服務器創建一個邏輯資料庫,其非常適合于分布式或資料集環境, |
| Example | 該引擎作為MySQL源代碼中的一個例子,說明了如何開始撰寫新的存盤引擎,這主要是開發商感興趣的,存盤引擎是一個什么都不做的“stub”,您可以使用此引擎創建表,但不能存盤資料或從中檢索資料, |
4.MySQL常用存盤引擎特性對比
| 特性 | MyISAM | Memory | InnoDB | Archive | NDB |
|---|---|---|---|---|---|
| 存盤限制 | 256TB | RAM | 64TB | NONE | 384EB |
| 事務 | NO | NO | YES | NO | NO |
| 鎖粒度 | TABLE | TABLE | ROW | ROW | ROW |
| B-tree索引 | YES | YES | YES | NO | NO |
| T-tree索引 | NO | NO | NO | NO | YES |
| Hash索引 | NO | YES | NO | NO | YES |
| Full-text search索引 | YES | NO | YES | NO | NO |
| Clustered索引 | NO | NO | YES | NO | NO |
| 資料快取 | NO | N/A | YES | NO | YES |
| 索引快取 | YES | N/A | YES | NO | YES |
| 壓縮資料 | YES | NO | YES | YES | NO |
| 加密資料 | YES | YES | YES | YES | YES |
| 集群資料庫支持 | NO | NO | NO | NO | YES |
| 主從復制支持 | YES | YES | YES | YES | YES |
| 外鍵支持 | NO | NO | YES | NO | NO |
5.設定與更改MySQL的引擎
5.1.設定表的引擎
如果建表的時候不指定引擎,那么表的引擎就會和資料庫的默認配置一致,
指定表的引擎建立表,建立一個學生表:
create tables `student` (
`Sno` int(10) not null comment '學號',
`Sname` varchar(16) not null comment '姓名',
`Ssex` char(2) not null comment '性別',
`Sage` varchar(16) default null,
`Sdept` varchar(16) default null comment '學生所在系別',
key `ind_sage` (`Sage`),
key `ind_sno` (`Sno`)
) engine=myisam default charset=utf8 # 最后一行括號外,指定引擎,
5.2.更改表的引擎
一般來說,更改MySQL引擎的需求并不多見,但偶爾也會有,更改表的引擎的幾種修改方法,
5.2.1.利用SQL命令陳述句修改引擎
alter table oldboy engine = innodb;
alter table oldboy engine = myisam;
更改引擎:
show create table test\G
alter table test engine = myisam;
show create table test\G
使用此方法若要批量修改,則需要通過開發腳本實作,與分表分庫腳本差不多,
5.2.2.使用sed對備份的SQL檔案進行批量轉換
使用sed對備份內容進行引擎轉換:
nohup sed -e 's/MyISAM/InnoDB/g' oldboy.sql > oldboy_1.sql &
5.2.3.mysql_convert_table_format命令修改
mysql_convert_table_format --user=root --password=oldboy123 --socket=/data/3306/mysql.sock --engine=myisam oldboy test
該命令需要一些依賴包,安裝方法為:
yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes
6.MyISAM引擎
6.1.什么是MyISAM引擎
MyISAM引擎是MySQL關系型資料庫管理系統的默認存盤引擎(MySQL5.5.5以前),這種MySQL表存盤結構可從舊的ISAM代碼中擴展出許多有用的功能,在新版本的MySQL中,InnoDB引擎由于支持事務、外鍵等,有利于資料的一致性,以及其能支持更高的多用戶并發性等優點,InnoDB已經取代了曾經常用的MyISAM引擎,不過由于資料庫中的MySQL庫的大部分表主要用于讀取,因此,MyISAM引擎依然在使用,
6.2.MyISAM引擎的存盤方式
每一個MyISAM引擎的表都對應于硬碟上的三個檔案,這三個檔案雖然具有一樣的檔案名,但是其不同的擴展名指示了其不同的型別用途:“.frm”檔案用于保存表的定義,該檔案并不是MyISAM引擎的一部分,而是服務器的一部分;“.MYD”用于保存表的資料;“.MYI”則是表的索引檔案,“.MYD”和.MYI是MyISAM的關鍵點,
MySQL資料庫系統的表大多數都使用MyISAM引擎,
6.3.MyISAM引擎的主要特點
| 特性 | 支持情況 | 說明 |
|---|---|---|
| 存盤限制 | 256TB | |
| 事務支持 | NO | |
| 鎖表粒度 | TABLE | 即資料更新時鎖定整個表:其鎖定機制是表級鎖定,這雖然可以讓鎖定的實作成本很小,但是同時也大大降低了其并發性能 |
| 全文索引 | YES | |
| 資料快取 | NO | 不會快取資料 |
| 索引快取 | YES | MyISAM可以通過key_buffer_size快取索引,以大大提高訪問性能,減少磁盤IO,但是這個快取區只會快取索引,而不會快取資料 |
| 外鍵支持 | NO | 不支持外鍵 |
| 資源占用 | 少 | 因為功能不多,且管理粒度較粗,因此,MyISAM消耗系統資源比InnoDB少很多 |
| 讀寫是否阻塞 | YES | 不僅會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀本身并不會阻塞另外的讀 |
| 是否默認 | NO | MyISAM是MySQL5.5.5之前默認的存盤引擎,因為性能問題,在MySQL后期版本中被取代 |
6.4.MyISAM引擎適用的生產業務場景
MyISAM引擎可以使用的生產業務場景,
1、不需要事務支持并且對資料一致性要求不高的業務,
2、一般適用于讀請求較多的應用,讀寫都頻繁的場景不適合,
3、讀寫并發訪問相對較低的業務,
4、資料修改相對較少的業務(阻塞問題),
5、硬體資源比較差的服務器,
6、使用讀寫分離的MySQL從庫可以使用MyISAM,
當下99%的企業業務場景,都不需要使用MyISAM了,而是選擇更有優勢的InnoDB,
7.InnoDB引擎
7.1.什么是InnoDB引擎
InnoDB引擎是當下MySQL資料庫最重要的存盤引擎,其正在成為目前MySQL AB所發行新版的標準,被包含在所有的安裝包里,與其他的存盤引擎相比,InnoDB引擎的優點是更新資料行級鎖定、支持ACID的事務、支持外鍵,它的設計目標是面向在線事務處理的應用,目前絕大多數互聯網公司都在使用InnoDB引擎,該引擎替代了其他的引擎,MySQL5.6版本的默認引擎已變為InnoDB引擎,
7.2.InnoDB引擎的存盤方式
InnoDB存盤引擎將資料存放在一個像黑盒一樣的邏輯表空間中,這個表空間分為共享表空間和獨立表空間,從MySQL5.6開始,即默認支持將InnoDB引擎的表資料單獨存放到各自獨立的ibd檔案中(獨立表空間),
7.3.InnoDB引擎的主要特點
| 特性 | 支持情況 | 說明 |
|---|---|---|
| 存盤限制 | 64TB | 存盤限制有些小 |
| 事務 | YES | 支持4個事務隔離級別,支持多版本讀 |
| 鎖粒度 | ROW | 更新資料僅鎖定行 |
| B-tree索引 | YES | |
| T-tree索引 | NO | |
| Hash索引 | NO | |
| Full-text search索引 | YES | 從5.5開始支持全文索引 |
| Clustered索引 | YES | 資料和主鍵以Cluster方式進行存盤,組成一顆平衡樹 |
| 資料快取 | YES | 高效快取特性:能快取索引,也能快取資料 |
| 索引快取 | YES | 高效快取特性:能快取索引,也能快取資料 |
| 壓縮資料 | YES | 可以壓縮資料 |
| 加密資料 | YES | 可以加密資料 |
| 集群資料庫支持 | NO | 不支持MySQL集群,NDB是集群的引擎 |
| 主從復制支持 | YES | 支持主從復制集群 |
| 資源占用 | 高 | 由于其功能和粒度都更強,因此對硬體的要求很高 |
| 磁區支持 | YES | 支持磁區,可以提升擴展性和性能 |
| 表空間支持 | YES | 支持共享和獨立表空間,有利于管理和提升性能 |
7.4.InnoDB引擎適用的生產業務場景
1、需要事務支持的業務(具有很好的事務特性),
2、行級鎖定對高并發有很好的適應能力,但需要確保查詢是通過索引來完成的,
3、資料讀寫及更新都較為頻繁的場景,如BBS、SNS、微博、微信等,
4、資料一致性要求較高的業務,例如:充值轉賬、銀行卡轉賬等,
5、硬體設備資源較好,特別是記憶體要大,可以利用InnoDB較好的快取能力來提高記憶體利用率,盡可能減少磁盤IO,
7.5.InnoDB引擎相關引數介紹
| InnoDB引擎的重要引數 | 說明 |
|---|---|
| innodb_buffer_pool_size = 2048M | InnoDB使用一個緩沖池來保存索引和原始資料,緩沖池設定的越大,理論上在存取表里面的資料時所需要的磁盤I/O就越少,官方建議將InnoDB的Buffer Pool值配置為物理記憶體的50%~80% |
| innodb_data_file_path = ibdata1:12M:autoextend | InnoDB資料檔案的路徑,默認為12MB大小ibdata1的單獨檔案,默認以64MB為單位自增(autoextend) |
| innodb_additional_mem_pool_size = 16M | 該引數用來設定InnoDB存盤的資料目錄資訊和其他內部資料結構的記憶體池大小,應用程式里的表越多,就需要在其中分配越多的記憶體,對于一個相對穩定的應用來說,這個引數的大小也是相對穩定的,沒有必要預留非常大的值,如果InnoDB將開始從作業系統分配記憶體,并且向MySQL錯誤日志中記錄警告資訊,默認為1MB,當發現錯誤日志中已經有相關的警告資訊時,就應該適當地增加該引數的大小 |
| innodb_file_io_threads = 4 | InnoDB中的檔案I/O執行緒,通常設定為4,如果是Windows則可以設定更大的值以提高磁盤I/O |
| innodb_thread_concurrency = 8 | 你的服務器中有幾個CPU就設定為幾,建議使用默認設定,一般設定為8 |
| innodb_flush_log_at_trx_commit = 2 | 若設定為0,就相當于innodb_log_buffer_size佇列滿后再統一存盤,默認值為1,該值也是最安全的設定 |
| innodb_log_buffer_size = 16M | 默認為1MB,通常設定為8~16MB就足夠了 |
| innodb_log_file_size = 128M | 確定日志檔案的大小,更大的設定可以提高性能,但也會增加資料庫恢復的時間 |
| innodb_log_files_in_group = 3 | 為提高性能,MySQL可以以回圈的方式將日志檔案寫到多個檔案,推薦設定為3 |
| innodb_max_dirty_pages_pct = 90 | InnoDB主執行緒重繪快取池中的資料 |
| innodb_lock_wait_timeout = 120 | InnoDB事務被回滾之前可以等待一個鎖定的超時秒數,InnoDB在它自己的鎖定表中自動檢測事務死鎖并且回滾事務,默認值為50秒 |
| innodb_file_per_table = 1 | InnoDB為獨立表空間模式,每個資料庫的每個表都會生成一個資料空間,值為0表示關閉,值為1表示開啟 |
| innodb_data_home_dir = /data/xxx | InnoDB資料的存放路徑 |
| innodb_log_group_home_dir = /data/xxx | 日志分組的目錄路徑 |
7.6.InnoDB引擎調優的基本方法
1、主鍵應盡可能小,以避免對Secondary index帶來過大的空間負擔,
2、建立有效索引避免全表掃描,因為會使用表鎖,
3、盡可能快取所有的索引和資料,提高回應速度,減少磁盤IO消耗,
4、在進行大批量小插入的時候,應盡量自己控制事務而不要使用autocommit自動提交,若有開關則可以控制提交方式,
5、合理設定innodb_flush_log_at_trx_commit引數值,不要過度追求安全性,
6、應避免主鍵更新,因為這會帶來大量的資料移動,
8.Memory存盤引擎
Memory就是記憶體的意思,因此Memory存盤引擎(又稱為heap引擎)的資料存盤是放在記憶體(注意:由max_heap_table_size引數控制記憶體占用大小,默認為16MB,)中的,因此存取速度特別快,但是如果資料庫宕機或重啟,那么所有的資料就都會丟失,因此它比較適合用于存放臨時表的資料,例如,discuz論壇資料庫中的統計在線人數的session表采用的就是Memory引擎,Memory存盤引擎默認采用的是Hash索引,而不像其他引擎(MyISAM和InnoDB)默認的是B-tree索引,
Memory存盤引擎在使用上也有一些限制,例如,僅支持表鎖,不支持TEXT和B1OB資料型別,還有當存盤變長欄位(varchar)時按照定長欄位(char)來進行的,這也會浪費一些記憶體空間,Memory存盤引擎在企業作業中應用的不是很多,
9.ARCHIVE存盤引擎
ARCHIVE的中文意思是歸檔,因此ARCHIVE適用于存放大量歸檔歷史資料(可查詢但不能洗掉)的保存,
ARCHIVE引擎僅支持select、insert操作;MySQL5.1以后開始支持索引等操作,
ARCHIVE引擎使用zlib無損資料壓縮演算法,壓縮比可達10:1,可大量節省磁盤空間,設計ARCHIVE引擎的目標是提供高速的插入和壓縮等功能,
建立兩個不同存盤引擎的表,測驗ARCHIVE存盤引擎的表其占用空間的情況:
首先建立一個MyISAM存盤引擎的表,插入資料:
create table t1 engine=myisam as select * from information_schema.columns;
show table status like 't1'\G
再建立一個ARCHIVE引擎表,插入資料:
create table t2 engine=archive as select * from information_schema.columns;
資料檔案形式:
.ARZ是資料壓縮檔案,.frm是表結構定義檔案
10.NDB存盤引擎
NDB存盤引擎是一個集群存盤引擎,類似于oracle的RAC集群,但它是share nothing的架構,因此NDB能夠提供更高級別的高可用和可擴展性,NDB的特點是資料全部存放在記憶體中,因此,通過主鍵進行查找的速度非常快,
關于NDB,有一個問題需要注意,它的連接(join)操作是在MySQL資料庫層完成的,而不是在存盤引擎層完成的,這就意味著,復雜的Join操作需要巨大的網路開銷,查詢速度會很慢,在中小型企業中,NDB引擎的使用頻率極少,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/51001.html
標籤:Linux
