MySQL常用存儲(chǔ)引擎之MyISAM
MySQL5.5之前版本默認(rèn)存儲(chǔ)引擎
臨時(shí)表
在排序、分組等操作中,當(dāng)數(shù)量超過(guò)一定的大小之后,由查詢優(yōu)化器建立的臨時(shí)表。
MyISAM存儲(chǔ)引擎表由MYD和MYI組成
CREATE TABLE `myIsam`(
`id` int(11) DEFAULT NULL,
`c1` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
ls -l
myIsam.frm
myIsam.MYD
myIsam.MYI
特性
- 并發(fā)性與鎖級(jí)別(表級(jí)鎖)
- 表?yè)p壞修復(fù)
- check table tablename
- repair table tablename
- MyISAM表支持的索引類型
- MyISAM表支持?jǐn)?shù)據(jù)壓縮
命令行:myisampack
限制
- 版本<MySQL5.0時(shí)默認(rèn)表大小為4G
如存儲(chǔ)大表則修改MAX_Rows和AVG_ROW_LENGTH - 版本>MySQL5.0時(shí)默認(rèn)支持為256TB
適用場(chǎng)景:
- 非事務(wù)型應(yīng)用
- 只讀類應(yīng)用
- 空間類應(yīng)用
MySQL常用存儲(chǔ)引擎之Innodb
MySQL5.5及之后版本默認(rèn)存儲(chǔ)引擎
Innodb使用表空間進(jìn)行 數(shù)據(jù)存儲(chǔ)
innodb_file_per_table
ON:獨(dú)立表空間:tablename.ibd
OFF:系統(tǒng)表空間:ibdataX
show variables like 'innodb_file_per_table';
set global innodb_file_per_table=off;
系統(tǒng)表空間和獨(dú)立表空間要如何選擇
比較:
- 系統(tǒng)表空間無(wú)法簡(jiǎn)單的收縮文件大小
- 獨(dú)立表空間可以通過(guò)optimize table命令收縮系統(tǒng)文件
- 系統(tǒng)表空間會(huì)產(chǎn)生IO瓶頸
- 獨(dú)立表空間可以同時(shí)向多個(gè)文件刷新數(shù)據(jù)
建議:
- 對(duì)Innodb使用獨(dú)立表空間(MySQL5.6之后默認(rèn)采用對(duì)表空間)
表轉(zhuǎn)移的步驟
把原來(lái)存在于系統(tǒng)表空間中的表轉(zhuǎn)移到獨(dú)立表空間中的方法
步驟:
1、使用mysqldump導(dǎo)出所有數(shù)據(jù)庫(kù)表數(shù)據(jù)
2、停止MySQL服務(wù),修改參數(shù),并刪除Innodb相關(guān)文件
3、重啟MySQL服務(wù),重建Innodb系統(tǒng)表空間
4、重新導(dǎo)入數(shù)據(jù)
Innodb存儲(chǔ)引擎的特性(1)
系統(tǒng)表空間和獨(dú)立表空間要如何選擇
- Innodb 數(shù)據(jù)字典信息
- Undo 回滾段
Innodb存儲(chǔ)引擎的特性
- Innodb是一種事務(wù)性存儲(chǔ)引擎
- 完全支持事務(wù)的ACID特性
- Redo Log 和 Undo Log
show variables like 'innodb_log_buffer_size';
show variables like 'innodb_log_files_in_group';
- Innodb支持行級(jí)鎖
- 行級(jí)鎖可以最大程度的支持并發(fā)
- 行級(jí)鎖是由存儲(chǔ)引擎層實(shí)現(xiàn)的
什么是鎖
- 鎖對(duì)主要作用是管理共享資源的并發(fā)訪問(wèn)
- 鎖用于實(shí)現(xiàn)事務(wù)的隔離性
鎖的類型
- 共享鎖(也稱讀鎖)
- 獨(dú)占鎖(也稱寫(xiě)鎖)
| 寫(xiě)鎖 | 讀鎖 | |
|---|---|---|
| 寫(xiě)鎖 | 不兼容 | 不兼容 |
| 讀鎖 | 不兼容 | 兼容 |
鎖的粒度
- 表級(jí)鎖
lock table tablename write;
unlock tables;
- 行級(jí)鎖
阻塞和死鎖
- 什么是阻塞
不同鎖的兼容性的關(guān)系,在有些時(shí)刻,一個(gè)事務(wù)中的鎖需要等到另一個(gè)事務(wù)中的鎖釋放他所占用的資源,這就形成了阻塞。 - 什么是死鎖
死鎖是指兩個(gè)或兩個(gè)以上的事務(wù)在執(zhí)行過(guò)程中,相互占用著對(duì)方等待的資源而產(chǎn)生的異常。
Innodb狀態(tài)檢查
show engine innodb status;
適用場(chǎng)景
- Innodb適合于大多數(shù)OLTP應(yīng)用
MySQL常用存儲(chǔ)引擎之CSV
文件系統(tǒng)存儲(chǔ)特點(diǎn)
數(shù)據(jù)以文本方式存儲(chǔ)在文件中
.CSV文件存儲(chǔ)表內(nèi)容
.CSM文件存儲(chǔ)表的元數(shù)據(jù)如表狀態(tài)和數(shù)據(jù)量
.frm文件存儲(chǔ)表結(jié)構(gòu)信息
特點(diǎn)
- 以CSV格式進(jìn)行數(shù)據(jù)存儲(chǔ)
- 所有列必須都是不能為NULL的
- 不支持索引
不適合大表,不適合在線處理 - 可以對(duì)數(shù)據(jù)文件直接編輯
保存文本文件內(nèi)容
適用場(chǎng)景
適合作為數(shù)據(jù)交換的中間表
電子表格->CSV文件->MySQL數(shù)據(jù)目錄
數(shù)據(jù)->CSV文件->其他Web程序
MySQL常用存儲(chǔ)引擎之Archive
文件系統(tǒng)存儲(chǔ)特點(diǎn)
- 以zlib對(duì)表數(shù)據(jù)進(jìn)行壓縮,磁盤I/O更少
- 數(shù)據(jù)存儲(chǔ)在ARZ為后綴的文件中
Archive存儲(chǔ)引擎的特點(diǎn)
- 只支持insert 和select 操作
- 只允許在自增ID列上加索引
使用場(chǎng)景
日志和數(shù)據(jù)采集器應(yīng)用
MySQL常用存儲(chǔ)引擎之Memory
文件系統(tǒng)存儲(chǔ)特點(diǎn)
也稱HEAP存儲(chǔ)引擎,所以數(shù)據(jù)保存在內(nèi)存中
功能特點(diǎn)
- 支持HASH索引和BTree索引
- 所有字段都為固定長(zhǎng)度 varchar(10)=char(10)
- 不支持BLOG和TEXT等大字段
- Memory存儲(chǔ)引擎使用表級(jí)鎖
- 最大大小由max_heap_table_size參數(shù)決定
容易混淆的概念
Memory存儲(chǔ)引擎
VS
臨時(shí)表
- 系統(tǒng)使用臨時(shí)表
- 超過(guò)限制使用Myisam臨時(shí)表
-未超限制使用Memory表
- 超過(guò)限制使用Myisam臨時(shí)表
- create temporary table 建立的臨時(shí)表
使用場(chǎng)景
- 用于查找或者是映射表,例如郵編和地區(qū)的對(duì)應(yīng)表
- 用于保存數(shù)據(jù)分析中產(chǎn)生的中間表
- 用于緩存周期性聚合數(shù)據(jù)的結(jié)果表
Memory數(shù)據(jù)易丟失,所以要求數(shù)據(jù)可再生
MySQL常用存儲(chǔ)引擎之Federated
特點(diǎn)
- 提供了訪問(wèn)遠(yuǎn)程MySQL服務(wù)器上表的方法
- 本地不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)全部放到遠(yuǎn)程服務(wù)器上
- 本地需要保存表結(jié)構(gòu)和遠(yuǎn)程服務(wù)器的連接信息
如何使用
默認(rèn)禁止,啟用需要在啟動(dòng)時(shí)增加federated參數(shù)
mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name
show engines;
federated=1
create database local;
create database remote;
use remote;
create table remote_fed(id int auto_increment not null, c1 varchar(10) not null default '', c2 char(10) not null default '',primery key(id))engine=innodb;
show create table remote_fed\G
insert into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('ddd','fff');
grant select,update,insert,delete on remote.remote_fed to fred_link@'127.0.0.1' identified by '123456';
use local;
create table remote_fed(id int(11) not null auto_increment, c1 varchar(10) not null default '', c2 char(10) not null default '', primary key(id))engine=federated connection='mysql://fred_link:123456@127.0.0.1:3306/remote/remote_fed';
rename table remote_fed to local_fed;
select * from local.local_fed;
delete from local.local_fed where id=2;
use remote;
select * fro remote_fed;
使用場(chǎng)景
偶爾的統(tǒng)計(jì)分析及手工查詢
如何選擇存儲(chǔ)引擎
參考條件
- 事務(wù)
- 備份
- 崩潰恢復(fù)
- 存儲(chǔ)引擎的特有特性
不要混合使用存儲(chǔ)引擎