一、存盤引擎概念
? MySQL中的資料用各種不同的技術存盤在檔案中,每一種技術都使用不同的存盤機制、索引技巧、鎖定水平并最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱為存盤引擎
? 存盤引擎是MySQL將資料存盤在檔案系統中的存盤方式或者存盤格式
? MySQL常用的存盤引擎
(1)MyISAM
(2)InnoDB
? MySQL資料庫中的組件,負責執行實際的資料/O操作
? MySQL系統中,存盤引擎處于檔案系統之上,在資料保存到資料檔案之前會傳輸到存盤引擎,之后按照各個存盤引擎的存盤格式進行存盤
二、MyISAM的特點介紹
? MyISAM不支持事務,也不支持外鍵約束,只支持全文索引,資料檔案和索引檔案是分開保存的
? 訪問速度快,對事務完整性沒有要求
? MyISAM適合查詢、插入為主的應用
? MyISAM在磁盤上存盤成三個檔案,檔案名和表名都相同,但是擴展名分別為:
(1).frm檔案存盤表結構的定義
(2)資料檔案的擴展名為.MYD (MYData)
(3)索引檔案的擴展名是.MYI (MYIndex)
? 表級鎖定形式,資料在更新時鎖定整個表
? 資料庫在讀寫程序中相互阻塞
(1)會在資料寫入的程序阻塞用戶資料的讀取
(2)也會在資料讀取的程序中阻塞用戶的資料寫入
? 資料單獨寫入或讀取,速度程序較快且占用資源相對少
? MyIAM支持的存盤格式
(1)靜態表
(2)動態表
(3)壓縮表
三、MyISAM適用的生產場景舉例
? 公司業務不需要事務的支持
? 單方面讀取或寫入資料比較多的業務
? MyISAM存盤引擎資料讀寫都比較頻繁場景不適合
? 使用讀寫并發訪問相對較低的業務
? 資料修改相對較少的業務
? 對資料業務-致性要求不是非常高的業務
? 服務器硬體資源相對比較差
四、InnoDB特點
? 支持事務,支持4個事務隔離級別
? MySQL從5.5.5版本開始,默認的存盤引擎為InnoDB
? 讀寫阻塞與事務隔離級別相關
? 能非常高效的快取索引和資料
? 表與主鍵以簇的方式存盤
? 支持磁區、表空間,類似oracle資料庫
? 支持外鍵約束,5.5前不支持全文索引,5.5后支持全文索引
? 對硬體資源要求還是比較高的場合
? 行級鎖定,但是全表掃描仍然會是表級鎖定,如
update table set a=1 where user like '%zhang%;
? InnoDB中不保存表的行數,如select count(* ) from table;時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可,需要注意的是,當count(*)陳述句包含where條件時MyISAM也需要掃描整個表
? 對于自增長的欄位,InnoDB 中必須包含只有該欄位的索引,但是在MyISAM表中可以和其他欄位一起建立組合索引
?清空整個表時,InnoDB是- -行一 行的洗掉,效率非常慢,MyISAM則會重建表,
五、InnoDB適用生產場景分析
? 業務需要事務的支持
? 行級鎖定對高并發有很好的適應能力,但需確保查詢是通過索引來完成
? 業務資料更新較為頻繁的場景
如:論壇,微博等
? 業務資料一致性要求較高
如:銀行業務
? 硬體設備記憶體較大,利用InnoDB較好的快取能力來提高記憶體利用率,減少磁盤I0的壓力
六、企業選擇存盤引擎依據
? 需要考慮每個存盤引擎提供了哪些不同的核心功能及應用場景
? 支持的欄位和資料型別
(1)所有引擎都支持通用的資料型別
(2)但不是所有的引擎都支持其它的欄位型別,如二進制物件
? 鎖定型別:不同的存盤引擎支持不同級別的鎖定
(1)表鎖定: MyISAM 支持
(2)行鎖定: InnoDB 支持
■索引的支持
?建立索引在搜索和恢復資料庫中的資料時能顯著提高性能
?不同的存盤弓|擎提供不同的制作索引的技術
?有些存盤引擎根本不支持索引
■事務處理的支持
?提高在向表中更新和插入資訊期間的可靠性
?可根據企業業務是否要支持事務選擇存盤引擎
七、MyISAM 表支持的3 種不同的存盤格式
7.1靜態(固定長度)表
靜態表是默認的存盤格式,靜態表中的欄位都是非可變欄位,這樣每個記錄都是固定長度的,這種存盤方式的優點是存盤非常迅速,容易快取,出現故障容易恢復;缺點是占用的空間通常比動態表多,
7.2動態表
動態表包含可變欄位,記錄不是固定長度的,這樣存盤的優點是占用空間較少,但是頻繁的更新、洗掉記錄會產生碎片,需要定期執行 OPTIMIZE TABLE 陳述句或 myisamchk -r 命令來改善性能,并且出現故障的時候恢復相對比較困難,
7.3壓縮表
壓縮表由 myisamchk 工具創建,占據非常小的空間,因為每條記錄都是被單獨壓縮的,所以只有非常小的訪問開支,
八、控制陳述句
8.1查看系統支持的存盤引擎
show engines;

8.2查看表使用的存盤引擎
方法一: show table status from bdqn where name = 'ky23'\G; 方法二: use 庫名; show create table 表名;
方法一:

方法二:

8.3修改存盤引擎
(1)通過 alter table 修改
use 庫名;
alter table 表名 engine=MyISAM;

(2)通過修改 /etc/my.cnf 組態檔,指定默認存盤引擎并重啟服務
vim /etc/my.cnf ...... [mysqld] ...... default-storage-engine=INNODB systemctl restart mysql.service
注意:此方法只對修改了組態檔并重啟mysql服務后新創建的表有效,已經存在的表不會有變更,

(3)通過 create table 創建表時指定存盤引擎
use 庫名;
create table 表名(欄位1 資料型別,...) engine=MyISAM;

總結
InnoDB與MyISAM的區別:
MyISAM:不支持事務和外鍵約束,占用空間較小,訪問速度快,表級鎖定,適用于不需要事務處理,但多寫入或查詢的應用場景,
InnoDB:支持事務處理、外鍵約束、占用空間比MyISAM大,支持行級鎖定,讀寫并發能力較好,適用于一致性要求高、資料更新頻繁的應用場景,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538556.html
標籤:其他
上一篇:面試題系列:MQ 奪命連環11問
