日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL事务与存储引擎相关设置

發(fā)布時(shí)間:2024/2/28 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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ù)
#BEGINSTART TRANSACTIONset autocommit=0(禁止自動提交) 開啟一個事務(wù)。#COMMITCOMMI TWORK: 提交事務(wù),并使已對數(shù)據(jù)庫進(jìn)行的所有修改變?yōu)橛谰眯缘摹?PS:執(zhí)行了COMMIT之后,才會促發(fā)I/O流進(jìn)行寫入#ROLLBACKROLLBACK WORK: 回滾會結(jié)束用戶的事務(wù),并撤銷正在進(jìn)行的所有未提交的修改。#SAVEPOINT S1:使用SAVEPOINT 允許在事務(wù)中創(chuàng)建一個回滾點(diǎn),一個事務(wù)中可以有多SAVEPOINT;"s1"代表回滾點(diǎn)名稱。#ROLLBACK TO [SAVEPOINT]S1: 把事務(wù)回滾到標(biāo)記點(diǎn)。 PS:執(zhí)行了COMMIT之后,才會促發(fā)工I/O流進(jìn)行寫入

示例

示例: 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。