MySQL事务与存储引擎相关设置
生活随笔
收集整理的這篇文章主要介紹了
MySQL事务与存储引擎相关设置
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
MySQL事務(wù)與存儲引擎
- 一、事務(wù)的ACID特點(diǎn)
- 1、原子性
- 2、一致性
- 3、隔離性
- 4、持久性
- 二、事務(wù)之間的互相影響
- 三、事務(wù)的四大隔離
- 四、事務(wù)控制語句
- 示例
- 1、開啟、提交事務(wù)
- 2、事務(wù)回滾
- 3、多點(diǎn)回滾
- 4、使用set設(shè)置控制事務(wù)
- 五、MySQL存儲引擎
- 1、存儲引擎概念介紹
- 2、MyISAM
- ISAM的特點(diǎn)
- MyIAM特點(diǎn)
- MyIAM支持的存儲格式
- MyISAM適用的生產(chǎn)場景舉例
- 3、InnoDB
- InnoDB特點(diǎn)
- InnoDB存儲引擎存儲成的三個文件
- 4、查看系統(tǒng)支持的存儲引擎
- 5、查看表使用的存儲引擎
- 方法一
- 方法二
- 6、修改存儲引擎
- 方法一:通過 alter table 修改
- 方法二:通過修改 /etc/my.cnf 配置文件,指定默認(rèn)存儲引擎并重啟服務(wù)
- 方法三:通過 create table 創(chuàng)建表時(shí)指定存儲引擎
一、事務(wù)的ACID特點(diǎn)
1、原子性
- 指事務(wù)是一個不可再分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
- 事務(wù)是一個完整的操作,事務(wù)的各元素是不可分的。
- 事務(wù)中的所有元素必須作為一個整體提交或回滾。
- 如果事務(wù)中的任何元素失敗,則整個事務(wù)將失敗。
2、一致性
- 指在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性約束沒有被破壞。
- 當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)。
- 在事務(wù)開始前,數(shù)據(jù)庫中存儲的數(shù)據(jù)處于一致狀態(tài)。
- 在正在進(jìn)行的事務(wù)中,數(shù)據(jù)可能處于不一致的狀態(tài)。
- 當(dāng)事務(wù)成功完成時(shí),數(shù)據(jù)必須再次回到已知的一致狀態(tài)。
3、隔離性
- 指在并發(fā)環(huán)境中,當(dāng)不同的事務(wù)同時(shí)操縱相同的數(shù)據(jù)時(shí),每個事務(wù)都有各自的完整數(shù)據(jù)空間。
- 對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,表明事務(wù)必須是獨(dú)立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)。
- 修改數(shù)據(jù)的事務(wù)可在另一個使用相同數(shù)據(jù)的事務(wù)開始之前訪問這些數(shù)據(jù),或者在另一個使用相同數(shù)據(jù)的事務(wù)結(jié)束之后訪問這些數(shù)據(jù)。
4、持久性
- 在事務(wù)完成以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會被回滾。
- 指不管系統(tǒng)是否發(fā)生故障,事務(wù)處理的結(jié)果都是永久的。
- 一旦事務(wù)被提交,事務(wù)的效果會被永久地保留在數(shù)據(jù)庫中。
二、事務(wù)之間的互相影響
- 臟讀:一個事務(wù)讀取了另一個事務(wù)未提交的數(shù)據(jù),而這個數(shù)據(jù)是有可能回滾的。
- 不可重復(fù)讀:一個事務(wù)內(nèi)兩個相同的查詢卻返回了不同數(shù)據(jù)。這是由于查詢時(shí)系統(tǒng)中其他事務(wù)修改的提交而引起的。
- 幻讀:一個事務(wù)對一個表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),另一個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,操作前一個事務(wù)的用戶會發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。
- 丟失更新:兩個事務(wù)同時(shí)讀取同一條記錄,A先修改記錄,B也修改記錄(B不知道A修改過),B提交數(shù)據(jù)后B的修改結(jié)果覆蓋了A的修改結(jié)果。
三、事務(wù)的四大隔離
- read uncommitted (讀取尚未提交的數(shù)據(jù)) :不解決臟讀
- read committed(讀取已經(jīng)提交的數(shù)據(jù)) :可以解決臟讀
- repeatable read(重復(fù)讀取):可以解決臟讀 和 不可重復(fù)讀 ——mysql默認(rèn)的
- serializable(串行化):可以解決 臟讀 不可重復(fù)讀 和 幻讀——相當(dāng)于鎖表
四、事務(wù)控制語句
MySQL事務(wù)默認(rèn)是自動提交的,當(dāng)SQL語句提交時(shí)事務(wù)便自動提交
- PS:我們?nèi)粘J褂胹ql語句進(jìn)行操做之所以可以執(zhí)行成功,是因?yàn)閙ysql實(shí)現(xiàn)了自動提交、執(zhí)行操作,而我們也可以關(guān)閉這個自動提交功能’,也就是說我們只能手動提交,而我們提交前,我們做的修改是在內(nèi)存中修改的,并不會提交到磁盤,一旦提交到磁盤,那就表示對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行了修改,mysql會把我們修改的對象(表)提交一份副本到內(nèi)存中,方便我們進(jìn)行修改,改完之后執(zhí)行"提交",就可以直接修改實(shí)際數(shù)據(jù)
示例
示例: use school; create table test( id int (10)primary key not null,name varchar (40), address varchar ( 40));insert into test values(1,'張三','南京'); insert into test values (2,'王五','北京');1、開啟、提交事務(wù)
begin; update test set address='云南 where name='張三'; commit;select * from test;
2、事務(wù)回滾
begin; update test set address= '山東' where name='王五'; rollback; select * from test;3、多點(diǎn)回滾
begin; . update test set address= '上海' where name='王五'; SAVEPOINT S1; update test set address= '蘇州' where name='張三'; SAVEPOINT S2; insert into test values (3,'趙六''武漢'); select *from test; ROLLBACK TO S1; select *from test;
4、使用set設(shè)置控制事務(wù)
SET AUTOCOMMIT=0; #禁止自動提交 SET AUTOCOMMIT=1; #開啟自動提交,Mysql默認(rèn)為1 SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值五、MySQL存儲引擎
1、存儲引擎概念介紹
- MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件中,每種技術(shù)都使用不同的存儲機(jī)制、索引技巧、鎖定水平并最終提供不同的功能和能力,這些不同的技術(shù)以及配套的功能在MySQL中稱為存儲引擎
- 存儲引擎是MySQL將數(shù)據(jù)存儲在文件系統(tǒng)中的存儲方式或者存儲格式
- MySQL常用的存儲引擎
- MyISAM
- InnoDB
- MySQL數(shù)據(jù)庫中的組件,負(fù)責(zé)執(zhí)行實(shí)際的數(shù)據(jù)I/O操作
- MySQL系統(tǒng)中,存儲引擎處于文件系統(tǒng)之上,在數(shù)據(jù)保存到數(shù)據(jù)文件之前會傳輸?shù)酱鎯σ?#xff0c;之后按照各個存儲引擎的存儲格式進(jìn)行存儲
2、MyISAM
ISAM的特點(diǎn)
MyIAM特點(diǎn)
- MyISAM不支持事務(wù),也不支持外鍵約束,支持全文索引,數(shù)據(jù)文件和索引文件是分開保存的
- 訪問速度快,對事務(wù)完整性沒有要求
- MyISAM適合查詢、插入為主的應(yīng)用
- MyISAM在磁盤.上存儲成三個文件,文件名和表名都相同,但是擴(kuò)展名分別為:
- .frm文件存儲表結(jié)構(gòu)的定義
- 數(shù)據(jù)文件的擴(kuò)展名為.MYD(MYData)
- 索引文件的擴(kuò)展名是.MYI(MYIndex)
MyIAM支持的存儲格式
- (1)靜態(tài)表
靜態(tài)表是默認(rèn)的存儲格式。靜態(tài)表中的字段都是非可變字段,這樣每個記錄都是固定長度的,這種存儲方式的優(yōu)點(diǎn)是存儲非常迅速,容易緩存,出現(xiàn)故障容易恢復(fù);缺點(diǎn)是占用的空間通常比動態(tài)表多。 - (2)動態(tài)表
動態(tài)表包含可變字段,記錄不是固定長度的,這樣存儲的優(yōu)點(diǎn)是占用空間較少,但是頻繁的更新、刪除記錄會產(chǎn)生碎片,需要定期執(zhí)行 OPTIMIZE TABLE 語句或 myisamchk -r 命令來改善性能,并且出現(xiàn)故障的時(shí)候恢復(fù)相對比較困難。 - (3)壓縮表
壓縮表由 myisamchk 工具創(chuàng)建,占據(jù)非常小的空間,因?yàn)槊織l記錄都是被單獨(dú)壓縮的,所以只有非常小的訪問開支。
MyISAM適用的生產(chǎn)場景舉例
- 公司業(yè)務(wù)不需要事務(wù)的支持
- 單方面讀取或?qū)懭霐?shù)據(jù)比較多的業(yè)務(wù)
- MyISAM存儲引擎數(shù)據(jù)讀寫都比較頻繁場景不適合
- 使用讀寫并發(fā)訪問相對較低的業(yè)務(wù)
- 數(shù)據(jù)修改相對較少的業(yè)務(wù)
- 對數(shù)據(jù)業(yè)務(wù)一致性要求不是非常高的業(yè)務(wù)
- 服務(wù)器硬件資源相對比較差
3、InnoDB
InnoDB特點(diǎn)
- 支持事務(wù):支持4個事務(wù)隔離級別
- 讀寫阻塞與事務(wù)隔離級別相關(guān)
- 具有非常高效的緩存特性:能緩存索引,也能緩存數(shù)據(jù)
- 表與主健以簇的方式存儲
- 支持分區(qū)、表空間,類似oracle數(shù)據(jù)庫
- 支持外鍵約束,5.5以前不支持全文索引,5.5版本以后支持全文索引
- 對硬件資源要求還是比較高的場合
- 行級鎖定,但是全表掃描仍然會是表級鎖定 示例:
- updata table set a=1 where user like ‘%zhang%’
- InnoDB中不保存表的行數(shù),如select count() from table;時(shí),InnoDB需要掃描一遍整個表來計(jì)算有多少行,但MyISAM只要簡單的讀出保存號的行數(shù)即可,需要注意的是,當(dāng)count()語句包含where條件時(shí)MyISAM也需要掃描整個表
對于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立組合索引
清空整個表時(shí),InnoDB是一行一行的刪除,效率非常慢,MyISAM則會重建表
InnoDB存儲引擎存儲成的三個文件
- db.opt(表屬性文件)
- 表名.frm(表結(jié)構(gòu)文件)
- 表名.ibd(表數(shù)據(jù)元數(shù)據(jù))
4、查看系統(tǒng)支持的存儲引擎
show engines;5、查看表使用的存儲引擎
方法一
show table status from 庫名 where name='表名'\G; 例: show table status from school where name='test'\G;方法二
use 庫名; show create table 表名\G;例: use school; show create table test\G;6、修改存儲引擎
方法一:通過 alter table 修改
use 庫名; alter table 表名 engine=MyISAM;例: use school; alter table test engine=MYISAM;方法二:通過修改 /etc/my.cnf 配置文件,指定默認(rèn)存儲引擎并重啟服務(wù)
vim /etc/my.cnf ...... [mysqld] ...... default-storage-engine=MYISAMsystemctl restart mysql.service
方法三:通過 create table 創(chuàng)建表時(shí)指定存儲引擎
use 庫名; create table 表名(字段1 數(shù)據(jù)類型,...) engine=INNODB;例: mysql -u root -p use school; create table test3( id int(10) not null, name varchar(20) not null ) engine=INNODB;總結(jié)
以上是生活随笔為你收集整理的MySQL事务与存储引擎相关设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 64GB DDR4内存大揭秘:三款品牌对
- 下一篇: MySQL-日志、完全备份恢复和增量备份