一、存儲引擎概述
1.概念
- MySQL中的數據用各種不同的技術存儲在文件中,每一種技術都使用不同的存儲機制、索引技巧、鎖定水平并最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱為存儲引擎
- 存儲引擎是MySQL將數據存儲在文件系統中的存儲方式或者存儲格式
- 存儲引擎是MySQL數據庫中的組件,負責執行實際的數據I/O操作
- MySQL系統中,存儲引擎工作在文件系統之上,數據庫的數據會先傳到存儲引擎,按照各個存儲引擎的存儲格式,保存到文件系統
MySQL 查詢數據的執行過程:
1、客戶端向 MySQL 服務器發送一條查詢請求,連接器負責處理連接,并進行身份驗證和權限控制。
2、MySQL 先檢查查詢緩存,如果命中緩存,則立刻返回存儲在緩存中的結果;否則使用查詢解析器進行SQL語句解析、預處理,再由優化器生成對應的執行計劃。
3、MySQL根據執行計劃,調用存儲引擎來執行查詢。
4、將結果返回給客戶端,同時緩存查詢結果。?
2.常用的存儲引擎
- MyISAM:Mysql 5.5之前的默認數據庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務
- InnoDB:事務型速記的首選引擎,支持ACID事務,支持行級鎖定,MySQL5.5成為默認數據庫引擎
二、MyISAM和InnoDB
類型 | MyISAM | InnoDB |
---|---|---|
事務 | 不支持事務 | 支持事務 |
外鍵約束 | 不支持外鍵約束 | 支持外鍵約束 |
鎖定方式 | 只支持表級鎖定 | 支持行級鎖定,全表掃描時會表級鎖定 |
讀寫性能 | 只支持單獨的查詢與插入,讀寫阻塞 | 讀寫和事務并發能力較好 |
全文索引 | 支持全文索引 | 支持全文索引(5.5版本以后支持) |
硬件 | 硬件資源占用較小 | 緩存能力較好,可以減少磁盤IO的壓力 |
存儲文件 | 數據文件和索引文件分開存儲,存儲為三個文件(.frm的表結構文件,.MYD的數據文件,.MYI的索引文件) | 數據文件也是索引文件,存儲成兩個文件(.frm的表結構文件,.ibd的數據和索引文件) |
使用場景 | 使用場景:使用不需要事務支持,單獨的查詢和插入的業務場景 | 使用場景:使用于需要事務支持,一致性要求比較高,數據會頻繁更新,讀寫并發高的業務場景; |
三、MySQL儲存引擎的管理
1.查看表使用的存儲引擎
use 庫名;
show create table 表名;show table status [from 庫名] where name='表名'\G;
2.查看系統支持的存儲引擎
show engines;
3.修改表默認存儲引擎
vim /etc/my.cnf
[mysqld]
default-storage-engine=innodb/myisamsystemctl restart mysqldmysql -uroot -p密碼create table 表名(字段 數據類型,...); #創建一個表
show create table 表名; #查看表結構,儲存引擎
?4.當表已經存在,想要修改其存儲引擎
alter table 表名 engine=innodb/myisam;
5.創建表的時候,直接指定存儲引擎
create table 表名 (字段 數據類型,...) engine=innodb/myisam;
#創建表時指定engine為innoDB
四、死鎖:
定義:死鎖是指兩個或多個事務在同一個資源上相互占用,并請求對方鎖定的資源,從而導致相互阻塞的現象。
如何避免死鎖?
1)設置事務的鎖等待超時時間 innodb_lock_wait_timeout
2)設置開啟死鎖檢測功能 innodb_deadlock_detect
show VARIABLES like 'innodb_deadlock_detect'; #查看當前死鎖檢測是否開啟set global innodb_deadlock_detect = ON; #ON為開啟死鎖檢測,OFF為關閉
3)為表建立合理的索引,減少表鎖發生的概率
4)如果業務允許,可以降低隔離級別,比如選用 提交讀 Read Committed 隔離級別,從而避免間隙鎖導致死鎖
5)建議開發人員盡量使用更合理的業務邏輯,比如多表操作時以固定順序訪問表,盡量避免同時鎖定多個資源
6)建議開發人員盡量保持事務簡短,減少對資源的占用時間和占用范圍
7)建議開發人員在讀多血少的場景下采用樂觀鎖機制