MySQL這樣學(xué)才叫了解!【4】

      網(wǎng)友投稿 629 2022-05-29

      十一、事務(wù)

      11.1、什么是事務(wù)

      一個(gè)事務(wù)是一個(gè)i完整的業(yè)務(wù)邏輯單元,不可再分。事務(wù)可以保證多個(gè)操作原子性,要么全成功,要么全失敗。對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō)事務(wù)保證批量的DML要么全成功,要么全失敗。

      和事務(wù)相關(guān)的語(yǔ)句只有DML語(yǔ)句,因?yàn)樗麄冞@三個(gè)語(yǔ)句都是和數(shù)據(jù)庫(kù)表中的數(shù)據(jù)相關(guān)的。事務(wù)的存在是為了保證數(shù)據(jù)的完整性、安全性。

      11.2、開(kāi)啟事務(wù)的原理

      假設(shè)我們完成一個(gè)操作,需要先執(zhí)行一條insert,然后再執(zhí)行一條update,最后執(zhí)行一條delete,在Mysql中執(zhí)行流程可以這么理解:

      11.3、事務(wù)的特征

      事務(wù)具有四個(gè)特征ACID

      原子性(Atomicity)

      事務(wù)是最小的工作單元,不可再分。整個(gè)事務(wù)中的所有操作,必須作為一個(gè)單元全部完成(取消)。

      一致性(Consistency)

      事務(wù)必須保證多條DML語(yǔ)句同時(shí)成功或者同時(shí)失敗。

      隔離性(Isolation)

      一個(gè)事務(wù)不會(huì)影響其他事務(wù)的運(yùn)行。

      持久性(Durability)

      最終該事務(wù)對(duì)數(shù)據(jù)庫(kù)所作的更改將持久地保存在硬盤文件之中,事務(wù)才算成功。

      MySQL事務(wù)默認(rèn)情況下是自動(dòng)提交的,可以通過(guò)命令來(lái)改成手工提交。

      start transaction;

      11.4、隔離性詳解

      11.4.1、并發(fā)訪問(wèn)可能導(dǎo)致的問(wèn)題

      一個(gè)事務(wù)開(kāi)始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒(méi)有能夠及時(shí)提交,這就出現(xiàn)了臟讀取。

      在同一個(gè)事務(wù)中,同一個(gè)讀操作對(duì)同一個(gè)數(shù)據(jù)的前后兩次讀取產(chǎn)生了不同的結(jié)果,這就是不可重復(fù)讀。

      幻像讀是指在同一個(gè)事務(wù)中以前沒(méi)有的行,由于其他事務(wù)的提交而出現(xiàn)的新行。幻讀強(qiáng)調(diào)的是前后讀的行數(shù)不一樣。

      11.4.2、隔離級(jí)別

      InnoDB 實(shí)現(xiàn)了四個(gè)隔離級(jí)別,用以控制事務(wù)所做的修改,并將修改通告至其它并發(fā)的事務(wù)。隔離級(jí)別從低往高依次是:

      讀未提交(READ UMCOMMITTED)

      讀已提交(READ COMMITTED)

      可重復(fù)讀(REPEATABLE READ) MySQL默認(rèn)

      串行化(SERIALIZABLE)

      對(duì)方的事務(wù)還沒(méi)有提交,我們當(dāng)前事務(wù)可以讀取到對(duì)方未提交的數(shù)據(jù)。這種隔離級(jí)別是最低的,讀為未提交存在臟讀現(xiàn)象,表示堵到了臟數(shù)據(jù)。

      對(duì)方事務(wù)提交之后的數(shù)據(jù)我們才可以讀到,這種隔離級(jí)別解決了臟讀現(xiàn)象,但是卻出現(xiàn)了不可重復(fù)讀現(xiàn)象。

      這個(gè)級(jí)別是oracle的默認(rèn)隔離級(jí)別。

      我們無(wú)法看到已提交的事務(wù)了,這種隔離級(jí)別雖然解決了不可重復(fù)讀的問(wèn)題,但是卻帶來(lái)了幻讀的問(wèn)題。比方說(shuō)一個(gè)線程刪除了數(shù)據(jù)庫(kù)中的所有數(shù)據(jù),但是我們依然讀取的是原來(lái)的數(shù)據(jù),讀到的是數(shù)據(jù)庫(kù)的備份。

      MySQL的默認(rèn)級(jí)別。

      將一個(gè)事務(wù)與其他事務(wù)完全地隔離。兩個(gè)事務(wù)不可以并發(fā),線程之間需要排隊(duì),也叫作序列化。雖然很安全,但是性能很低且客戶的體驗(yàn)不好。

      十二、索引

      12.1、什么是索引

      索引相當(dāng)于一本書的目錄,通過(guò)目錄可以快速找到對(duì)應(yīng)的資源。索引被用來(lái)快速找出在一個(gè)列上用一特定值的行,索引可以有效地縮小掃描的范圍。添加索引是給某個(gè)字段或者是某些字段添加的。

      在數(shù)據(jù)庫(kù)方面,查詢一張表的時(shí)候有兩種檢索方式:

      全表掃描

      根據(jù)索引檢索(效率高)

      索引雖然可以提高檢索的效率,但是不能隨意添加索引,因?yàn)樗饕彩菙?shù)據(jù)庫(kù)中的對(duì)象,也需要數(shù)據(jù)庫(kù)不斷地維護(hù),維護(hù)需要成本的。比如表中的的數(shù)據(jù)如果經(jīng)常被修改的話就不適合添加索引,因?yàn)閿?shù)據(jù)一旦被修改,索引需要重新排序。

      12.2、什么時(shí)候需要?jiǎng)?chuàng)建索引

      數(shù)據(jù)量龐大。

      該字段很少的DML操作(因?yàn)樽侄芜M(jìn)行修改操作,索引也需要維護(hù))。

      該字段經(jīng)常出現(xiàn)在where子句中(經(jīng)常根據(jù)哪個(gè)字段查詢)

      注意:主鍵和具有unique約束的字段會(huì)自動(dòng)添加索引,根據(jù)主鍵查詢的效率高,盡量根據(jù)主鍵索引,我們可以查詢sql語(yǔ)句的執(zhí)行計(jì)劃。他的底層是B+Tree。

      explain select * from emp where SAL = 1500;

      type字段的值時(shí)ALL表示是全表掃描(沒(méi)有添加索引)。rows表示搜索了14條數(shù)據(jù)。

      12.3、添加索引

      -- 給emp表的sal字段添加一個(gè)索引,名稱為emp_sal_index create index emp_sal_index on emp(sal); -- 語(yǔ)法格式 create index 索引名稱 on 表名(字段名)

      12.4、查看索引

      -- 查看索引的語(yǔ)法 show index from emp; -- 語(yǔ)法格式 show index from 表名;

      12.5、刪除索引

      -- 刪除索引的語(yǔ)法 drop index 索引名稱 on 表名;

      12.6、索引的原理

      索引底層采用的數(shù)據(jù)結(jié)構(gòu)是B+Tree,通過(guò)B+Tress縮小掃描范圍,底層索引進(jìn)行排序、分區(qū),索引會(huì)攜帶在表中的物理地址,最終通過(guò)索引檢索到數(shù)據(jù)之后,獲取到關(guān)聯(lián)的物理地址,通過(guò)物理地址定位到表中的數(shù)據(jù),效率是最高的(不走表,走硬盤)。

      select ename from emp where ename = 'SMITH';

      通過(guò)索引sql語(yǔ)句會(huì)轉(zhuǎn)換

      select ename from emp where 物理地址 = '索引檢索到的物理地址'

      12.7、索引的分類

      單一索引:給打那個(gè)字段添加索引。

      復(fù)合索引:給多個(gè)字段聯(lián)合起來(lái)添加索引。

      主鍵索引:主鍵上會(huì)自動(dòng)添加索引。

      唯一索引:有unique約束的字段上會(huì)自動(dòng)添加索引。

      12.8、索引的失效

      在模糊查詢的時(shí)候,如果第一個(gè)通配符使用的是%,這個(gè)索引會(huì)失效,因?yàn)樗恢酪婚_(kāi)始匹配的字符是什么。

      十三、視圖

      13.1、什么是視圖

      視圖是一種根據(jù)查詢(也就是SELECT表達(dá)式)定義的數(shù)據(jù)庫(kù)對(duì)象,用于獲取想要看到和使用的局部數(shù)據(jù)。所以他也稱為虛擬表。

      視圖是站在不同的角度看到數(shù)據(jù),同一張表的數(shù)據(jù),通過(guò)不同的角度去看待數(shù)據(jù)。

      我們可以對(duì)視圖進(jìn)行增刪改查,會(huì)影響到原表的數(shù)據(jù),通過(guò)視圖來(lái)影響原表數(shù)據(jù)的,并不是直接操作原表。只有DQL語(yǔ)句才可以以視圖對(duì)象的方式創(chuàng)建出來(lái)。

      13.2、創(chuàng)建視圖

      -- 語(yǔ)法格式 create view 視圖名 as select語(yǔ)句 -- 示范 create view myview as select empo,ename from emp;

      13.3、修改視圖

      -- 語(yǔ)法格式 update 視圖名 set 列名 = '值' where 條件;

      13.4、刪除視圖

      -- 語(yǔ)法格式 delete from 視圖名 where 條件; -- 示范 delete from myview where empo = '12134';

      13.5、視圖的作用

      視圖可以隱藏表的實(shí)現(xiàn)細(xì)節(jié),保密級(jí)別比較高的系統(tǒng),數(shù)據(jù)庫(kù)只對(duì)外提供相關(guān)的視圖,面向視圖對(duì)象進(jìn)行CRUD。

      十四、數(shù)據(jù)庫(kù)設(shè)計(jì)三范式

      設(shè)計(jì)范式是設(shè)計(jì)表的依據(jù),按照這三個(gè)范式設(shè)計(jì)的表不會(huì)出現(xiàn)數(shù)據(jù)冗余。但是在實(shí)際開(kāi)發(fā)中,根據(jù)客戶的需求,可能會(huì)拿數(shù)據(jù)冗余來(lái)?yè)Q取執(zhí)行速度,拿空間換時(shí)間。

      14.1、第一范式

      任何一張表都應(yīng)該有主鍵,且每一個(gè)字段原子性不可再分。

      14.2、第二范式

      建立在第一范式的基礎(chǔ)上,所有非主鍵字段完全依賴于主鍵,不能產(chǎn)生部分依賴。

      典型的例子就是解決多對(duì)多的問(wèn)題上,遇到多對(duì)多的時(shí)候,背口訣:多對(duì)多?三張表,關(guān)系表兩外鍵

      14.3、第三范式

      建立在第二范式的基礎(chǔ)上,所有非主鍵字段直接依賴主鍵,不能產(chǎn)生傳遞依賴。

      典型的例子就是一對(duì)多,遇到一對(duì)多問(wèn)題的時(shí)候背口訣:一對(duì)多??jī)蓮埍恚嗟谋砑油怄I。

      14.4、一對(duì)一關(guān)系的設(shè)計(jì)方案

      14.4.1、主鍵共享

      t_user_login 用戶登錄表

      t_user_detail 用戶詳細(xì)信息表

      14.4.2、外鍵唯一

      t_user_login 用戶登錄表

      t_user_detail 用戶詳細(xì)信息表

      視圖

      -- 語(yǔ)法格式 delete from 視圖名 where 條件; -- 示范 delete from myview where empo = '12134';

      13.5、視圖的作用

      視圖可以隱藏表的實(shí)現(xiàn)細(xì)節(jié),保密級(jí)別比較高的系統(tǒng),數(shù)據(jù)庫(kù)只對(duì)外提供相關(guān)的視圖,面向視圖對(duì)象進(jìn)行CRUD。

      十四、數(shù)據(jù)庫(kù)設(shè)計(jì)三范式

      設(shè)計(jì)范式是設(shè)計(jì)表的依據(jù),按照這三個(gè)范式設(shè)計(jì)的表不會(huì)出現(xiàn)數(shù)據(jù)冗余。但是在實(shí)際開(kāi)發(fā)中,根據(jù)客戶的需求,可能會(huì)拿數(shù)據(jù)冗余來(lái)?yè)Q取執(zhí)行速度,拿空間換時(shí)間。

      14.1、第一范式

      任何一張表都應(yīng)該有主鍵,且每一個(gè)字段原子性不可再分。

      14.2、第二范式

      建立在第一范式的基礎(chǔ)上,所有非主鍵字段完全依賴于主鍵,不能產(chǎn)生部分依賴。

      典型的例子就是解決多對(duì)多的問(wèn)題上,遇到多對(duì)多的時(shí)候,背口訣:多對(duì)多?三張表,關(guān)系表兩外鍵

      14.3、第三范式

      建立在第二范式的基礎(chǔ)上,所有非主鍵字段直接依賴主鍵,不能產(chǎn)生傳遞依賴。

      典型的例子就是一對(duì)多,遇到一對(duì)多問(wèn)題的時(shí)候背口訣:一對(duì)多??jī)蓮埍恚嗟谋砑油怄I。

      14.4、一對(duì)一關(guān)系的設(shè)計(jì)方案

      14.4.1、主鍵共享

      t_user_login 用戶登錄表

      MySQL這樣學(xué)才叫了解!【4】

      t_user_detail 用戶詳細(xì)信息表

      14.4.2、外鍵唯一

      t_user_login 用戶登錄表

      t_user_detail 用戶詳細(xì)信息表

      MySQL 數(shù)據(jù)庫(kù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:事務(wù)與數(shù)據(jù)庫(kù)連接池DBCP和C3P0與工具類DBUtils
      下一篇:完美取代hashmap,SpringBoot整合Redis緩存DB數(shù)據(jù)
      相關(guān)文章
      亚洲av永久无码精品古装片| 亚洲乱码一区二区三区在线观看| 亚洲国产精品lv| 亚洲精品午夜无码专区| 国产亚洲精aa成人网站| 亚洲伊人久久综合影院| 亚洲美日韩Av中文字幕无码久久久妻妇| 国产精品无码亚洲精品2021| 亚洲αⅴ无码乱码在线观看性色 | 丁香五月亚洲综合深深爱| 精品亚洲一区二区三区在线播放| 亚洲真人日本在线| 亚洲爽爽一区二区三区| 中文亚洲AV片在线观看不卡| 亚洲中文字幕在线观看| 国产亚洲成av人片在线观看| 亚洲AV无码久久精品成人| 亚洲AV无码1区2区久久| 亚洲精品国产电影午夜| 2020天堂在线亚洲精品专区| 日韩亚洲国产综合高清| 亚洲欧美成aⅴ人在线观看| 亚洲av无码专区在线电影天堂| 亚洲色大成网站www永久网站| 欧美激情综合亚洲一二区| 国产亚洲精品91| 亚洲人成网站在线观看青青| 亚洲一区二区三区影院| 久久精品国产亚洲香蕉| 久久精品国产亚洲av麻豆小说| 亚洲大香伊人蕉在人依线| 亚洲最大的成人网站| 亚洲AV无码国产一区二区三区| 精品国产亚洲AV麻豆| 国产亚洲成人在线播放va| 亚洲Av无码精品色午夜| 亚洲精品在线不卡| 亚洲精品女同中文字幕| 亚洲成AV人网址| 国产亚洲av片在线观看播放| 久久久亚洲欧洲日产国码二区|