国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

疫情最新資訊seo費(fèi)用

疫情最新資訊,seo費(fèi)用,網(wǎng)站開(kāi)發(fā) 常德,做百度推廣代運(yùn)營(yíng)有用嗎目錄 索引的作用 與 概念 MySQL有哪幾種索引類(lèi)型 如何提高查找效率 聚簇索引與非聚簇索引 覆蓋索引 索引的優(yōu)點(diǎn)和缺點(diǎn) 索引的一些基本操作 索引優(yōu)化 B樹(shù)、B樹(shù)、Hash、紅黑樹(shù)的區(qū)別 B樹(shù)與B樹(shù)的區(qū)別 MySQL為什么使用B樹(shù)作為索引 聯(lián)合索引中的順序 MySQL的最左前綴原…

目錄

索引的作用 與 概念

MySQL有哪幾種索引類(lèi)型

如何提高查找效率

聚簇索引與非聚簇索引

覆蓋索引

索引的優(yōu)點(diǎn)和缺點(diǎn)

索引的一些基本操作

索引優(yōu)化

B樹(shù)、B+樹(shù)、Hash、紅黑樹(shù)的區(qū)別

B樹(shù)與B+樹(shù)的區(qū)別

MySQL為什么使用B+樹(shù)作為索引

聯(lián)合索引中的順序

MySQL的最左前綴原則

查看表的索引信息

怎么判斷要不要加索引

所有的字段都適合建索引嗎

如何評(píng)估一個(gè)索引創(chuàng)建的是否合理??索引在哪些情況下會(huì)失效??如何避免索引失效?

如何判斷數(shù)據(jù)庫(kù)的索引有沒(méi)有生效?

索引是用來(lái)干什么的

索引的使用的場(chǎng)景

事務(wù)的概念

事務(wù)原子性如何保證

MySQL 事務(wù)的 ACID 特性

?事務(wù)的使用

MySQL中事務(wù)的隔離級(jí)別

臟讀、不可重復(fù)讀、幻讀


索引的作用 與 概念

索引就相當(dāng)于書(shū)的目錄,主要作用就是提高查找效率。

MySQL有哪幾種索引類(lèi)型

1、從存儲(chǔ)結(jié)構(gòu)上來(lái)劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引。這里所描述的是索引存儲(chǔ)時(shí)保存的形式。

2、從應(yīng)用層次來(lái)分:普通索引,唯一索引,復(fù)合索引。

  • 普通索引:即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引
  • 唯一索引:索引列的值必須唯一,但允許有空值
  • 復(fù)合索引:多列值組成一個(gè)索引,專(zhuān)門(mén)用于組合搜索,其效率大于索引合并
  • 聚簇索引(聚集索引):并不是一種單獨(dú)的索引類(lèi)型,而是一種數(shù)據(jù)存儲(chǔ)方式。具體細(xì)節(jié)取決于不同 的實(shí)現(xiàn),InnoDB的聚簇索引其實(shí)就是在同一個(gè)結(jié)構(gòu)中保存了B-Tree索引(技術(shù)上來(lái)說(shuō)是B+Tree)和 數(shù)據(jù)行。
  • 非聚簇索引: 不是聚簇索引,就是非聚簇索引。

如何提高查找效率

當(dāng)從數(shù)據(jù)庫(kù)中進(jìn)行查找操作時(shí),比如根據(jù)條件 id=3 查找:可以遍歷表進(jìn)行查詢(xún),但是這種方式效率比較低。 如何提高效率呢?

這就需要想辦法盡量避免遍歷,可以通過(guò)一些特殊的數(shù)據(jù)結(jié)構(gòu)來(lái)表示一些記錄的特征,通過(guò)這些特征來(lái)減少比較次數(shù),加快比較的速率。

當(dāng)查找效率提高時(shí),也將會(huì)付出一些代價(jià):

就相當(dāng)于與給書(shū)加上目錄會(huì)費(fèi)一些紙,即加上索引就會(huì)消耗一定的存儲(chǔ)空間,數(shù)據(jù)量越大,消耗的空間就越大?

書(shū)的目錄確定了,后續(xù)每次對(duì)書(shū)的內(nèi)容進(jìn)行調(diào)整時(shí),都可能會(huì)影響到目錄的準(zhǔn)確性,就需要重新調(diào)整目錄,同理,數(shù)據(jù)庫(kù)的索引也是一樣的,當(dāng)進(jìn)行增刪查改時(shí),往往也需要同步的調(diào)整索引的結(jié)構(gòu)?

聚簇索引與非聚簇索引

在 InnoDB 里,索引B+ Tree的葉子節(jié)點(diǎn)存儲(chǔ)了整行數(shù)據(jù)的是主鍵索引,也被稱(chēng)之為聚簇索引,即將數(shù)據(jù) 存儲(chǔ)與索引放到了一塊,找到索引也就找到了數(shù)據(jù)。 而索引B+ Tree的葉子節(jié)點(diǎn)存儲(chǔ)了主鍵的值的是非主鍵索引,也被稱(chēng)之為非聚簇索引、二級(jí)索引。

  1. 對(duì)于InnoDB來(lái)說(shuō),想要查找數(shù)據(jù)我們還需要根據(jù)主鍵再去聚集索引中進(jìn)行查找,這個(gè)再根據(jù)聚集 索引查找數(shù)據(jù)的過(guò)程,我們稱(chēng)為回表。第一次索引一般是順序IO,回表的操作屬于隨機(jī)IO。需要回表的次數(shù)越多,即隨機(jī)IO次數(shù)越多,我們就越傾向于使用全表掃描 。
  2. 通常情況下,主鍵索引(聚簇索引)查詢(xún)只會(huì)查一次,而非主鍵索引(非聚簇索引)需要回表查詢(xún)多次。當(dāng)然,如果是覆蓋索引的話(huà),查一次即可 。
  3. 注意:MyISAM無(wú)論主鍵索引還是二級(jí)索引都是非聚簇索引,而InnoDB的主鍵索引是聚簇索引,二級(jí)索引是非聚簇索引。我們自己建的索引基本都是非聚簇索引。

覆蓋索引

覆蓋索引是指一個(gè)索引包含了查詢(xún)所需的所有列數(shù)據(jù),因此在查詢(xún)時(shí)可以直接使用索引返回結(jié)果,而不需要回到數(shù)據(jù)表中查找數(shù)據(jù)行,從而大幅提高查詢(xún)性能。

舉個(gè)例子,假設(shè)有一張訂單表,包含了訂單編號(hào)、訂單金額、訂單日期等列,如果我們需要查詢(xún)某個(gè)日期范圍內(nèi)的所有訂單金額,我們可以在訂單日期列上創(chuàng)建一個(gè)索引,如果該索引還包含了訂單金額列,那么查詢(xún)時(shí)就可以直接使用這個(gè)索引返回查詢(xún)結(jié)果,而不需要再回到訂單表中查找對(duì)應(yīng)的訂單金額,這就是覆蓋索引。

可以看出,覆蓋索引可以大幅提高查詢(xún)性能,尤其是在大數(shù)據(jù)量的情況下。但是,在創(chuàng)建覆蓋索引時(shí)需要注意,索引需要包含查詢(xún)所需的所有列數(shù)據(jù),因此索引的大小可能會(huì)比較大,從而增加讀取磁盤(pán)的成本,也需要權(quán)衡創(chuàng)建索引的成本和查詢(xún)性能的提高。

索引的優(yōu)點(diǎn)和缺點(diǎn)

索引帶來(lái)的好處:提高了查找得速度
索引帶來(lái)得壞處:占用了更多的空間,拖慢了增刪查改的速度

從表面來(lái)上看,似乎索引的壞處 比 索引帶來(lái)的好處要多。但!這不必意味著 弊大于利!!
因?yàn)樵趯?shí)際需求的場(chǎng)景中,查詢(xún)操作往往是最高頻率的操作。
相對(duì)于“增刪改” 的使用頻率則低的可憐。
因此,查詢(xún)作為一個(gè)高頻操作,索引對(duì)其來(lái)說(shuō)是不可缺少的,
?
另外,有了索引之后對(duì)于查詢(xún)的效率的提升使非常巨大的!!!
當(dāng)MySQL里面的數(shù)據(jù)量級(jí) 達(dá)到千萬(wàn)級(jí)別的時(shí)候(一個(gè)表里就有幾千萬(wàn),甚至破億的數(shù)據(jù))再去遍歷表,就會(huì)非常非常的低效!!!
?
在另一方面:MySQL在進(jìn)行數(shù)據(jù)比較的時(shí)候,不是像我們編程那樣,一個(gè)for循環(huán)(這樣的想法是錯(cuò)誤的)。
編程上的查詢(xún)是在內(nèi)存中的比較;MySQL 中的比較是在硬盤(pán)上比較。
也就是說(shuō):在MySQL中的每一次比較都會(huì)涉及到硬盤(pán)的 IO 操作。

索引的一些基本操作

1.查看索引:show index from 表名
有些約束是自動(dòng)帶索引的,比如:primary ,unique
2.給指定列創(chuàng)建索引create index 索引名字 on 表名(列名);
例如:create index class_index on student(class);-- 給class這一列加上索引
注意:創(chuàng)建索引是一個(gè)非常低效的事情,尤其是當(dāng)前表里面已經(jīng)有很多數(shù)據(jù)的時(shí)候
所以,當(dāng)你針對(duì)線(xiàn)上的數(shù)據(jù)庫(kù)的時(shí)候,如果這個(gè)表沒(méi)有索引的時(shí)候,不要貿(mào)然去加上索引…
3.刪除索引drop index 索引名字 on student 表名
例如:drop index class_index on student;
注意:刪除索引和創(chuàng)建索引一樣,都是效率比較低的操作,也容易把數(shù)據(jù)庫(kù)搞掛
因此,在創(chuàng)建表的時(shí)候,就應(yīng)該把索引規(guī)劃好。

索引優(yōu)化

確定需要?jiǎng)?chuàng)建的索引的列:

可以通過(guò)查詢(xún)SQL語(yǔ)句的執(zhí)行計(jì)劃,找出哪些SQL語(yǔ)句的查詢(xún)效率比較低,然后確定需要?jiǎng)?chuàng)建索引的列。

確定索引類(lèi)型:

不同的索引類(lèi)型在不同的場(chǎng)景下具有不同的優(yōu)勢(shì),需要根據(jù)具體的業(yè)務(wù)需求和場(chǎng)景來(lái)選擇合適的索引類(lèi)型。

避免在索引列上使用函數(shù)或者表達(dá)式:

在索引列上使用函數(shù)或者表達(dá)式會(huì)導(dǎo)致索引失效,從而降低查詢(xún)性能。

避免使用 OR 連接條件:

在查詢(xún)語(yǔ)句中使用 OR 連接條件會(huì)導(dǎo)致索引失效,從而降低查詢(xún)性能。

避免在表達(dá)式左側(cè)使用運(yùn)算符:

在查詢(xún)語(yǔ)句中,將運(yùn)算符放在表達(dá)式的左側(cè)會(huì)導(dǎo)致索引失效,從而降低查詢(xún)性能。

B樹(shù)、B+樹(shù)、Hash、紅黑樹(shù)的區(qū)別

BTree:

B樹(shù)是一棵多路平衡查找樹(shù)

  • B樹(shù)的每個(gè)節(jié)點(diǎn)都存儲(chǔ)索引和數(shù)據(jù)(key和data)
  • 每個(gè)節(jié)點(diǎn)中的關(guān)鍵字都按照從小到大的順序排列
  • 所有葉子節(jié)點(diǎn)都位于同一層,或者說(shuō)根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)的長(zhǎng)度都相同

?B+Tree:

B+樹(shù)也是一棵多路平衡查找樹(shù)

  • B+樹(shù)中非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只存儲(chǔ)索引。對(duì)于非葉子節(jié)點(diǎn)中key都按照從小到大的順序排列, 非葉子節(jié)點(diǎn)中的每一個(gè)key,都會(huì)出現(xiàn)在子節(jié)點(diǎn)中,是子節(jié)點(diǎn)中最大或最小元素。所有的非葉子節(jié)點(diǎn)起到了索引作用。
  • 只有葉子節(jié)點(diǎn)存儲(chǔ)data,葉子節(jié)點(diǎn)包含了這棵樹(shù)的所有數(shù)據(jù)。
  • 葉子節(jié)點(diǎn)依據(jù)關(guān)鍵字的大小從小到大順序鏈接,形成一個(gè)有序鏈表。便于區(qū)間查找和遍歷。
  • 所有葉子節(jié)點(diǎn)都位于同一層,或者說(shuō)根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)的長(zhǎng)度都相同。

Hash索引:
雖然可以快速定位,但是沒(méi)有順序,IO復(fù)雜度高;
適合等值查詢(xún),如=、in(),不支持范圍查詢(xún) ;
因?yàn)椴皇前凑账饕淀樞虼鎯?chǔ)的,就不能像B+Tree索引一樣利用索引完成排序 ;
如果有大量重復(fù)鍵值得情況下,哈希索引的效率會(huì)很低,因?yàn)榇嬖诠E鲎矄?wèn)題 。
紅黑樹(shù):
樹(shù)的高度隨著數(shù)據(jù)量增加而增加,IO代價(jià)高。

B樹(shù)與B+樹(shù)的區(qū)別

B+樹(shù)的優(yōu)勢(shì):

  • IO次數(shù)更少
  • 查詢(xún)性能很穩(wěn)定
  • 范圍查詢(xún)更簡(jiǎn)便

1.B樹(shù)的每個(gè)節(jié)點(diǎn)都存儲(chǔ)key和data,B+樹(shù)只有葉子節(jié)點(diǎn)存儲(chǔ)data,葉子節(jié)點(diǎn)包含了這棵樹(shù)的所有數(shù)據(jù),這樣一個(gè)葉子節(jié)點(diǎn)可以存儲(chǔ)更多的key,可以使樹(shù)更矮,所以 IO操作的次數(shù)更少。

2.B+樹(shù)中所有的葉子節(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表,可以按照關(guān)鍵子碼排序的次序遍歷全部記錄,由于數(shù)據(jù)順序排列并相連,所以編譯區(qū)間查找和搜索。而B(niǎo)樹(shù)則需要進(jìn)行每一層的遍歷,相鄰的元素可能在內(nèi)存中并不相鄰。

3.在B樹(shù)中,當(dāng)要查找的值恰好在一個(gè)非葉子節(jié)點(diǎn)時(shí),查找到該節(jié)點(diǎn)就會(huì)成功并結(jié)束查詢(xún),而B(niǎo)+樹(shù)由于非葉子節(jié)點(diǎn)只是索引部分,這些節(jié)點(diǎn)中只含有其子樹(shù)中最大或最小關(guān)鍵字,當(dāng)非終端節(jié)點(diǎn)的關(guān)鍵字等于給定值時(shí),查找并不終止,而是繼續(xù)向下查找直到葉子節(jié)點(diǎn)。因此,在B+樹(shù)中,無(wú)論是否查找成功,都是走了一條從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑。

MySQL為什么使用B+樹(shù)作為索引

(1)B+樹(shù)的磁盤(pán)讀寫(xiě)代價(jià)更低:B+樹(shù)的內(nèi)部節(jié)點(diǎn)并沒(méi)有指向關(guān)鍵字具體信息的指針,因此其內(nèi)部節(jié)點(diǎn)相對(duì)B樹(shù)更小,如果把所有同一內(nèi)部節(jié)點(diǎn)的關(guān)鍵字存放在同一盤(pán)塊中,那么盤(pán)塊所能容納的關(guān)鍵字?jǐn)?shù)量也越多,一次性讀入內(nèi)存的需要查找的關(guān)鍵字也就越多,相對(duì)IO讀寫(xiě)次數(shù)就降低了。

(2)B+樹(shù)的查詢(xún)效率更加穩(wěn)定:由于非終結(jié)點(diǎn)并不是最終指向文件內(nèi)容的結(jié)點(diǎn),而只是葉子結(jié)點(diǎn)中關(guān)鍵字的索引。所以任何關(guān)鍵字的查找必須走一條從根結(jié)點(diǎn)到葉子結(jié)點(diǎn)的路。所有關(guān)鍵字查詢(xún)的路徑長(zhǎng)度相同,導(dǎo)致每一個(gè)數(shù)據(jù)的查詢(xún)效率相當(dāng)。

(3)B+樹(shù)更便于遍歷:由于B+樹(shù)的數(shù)據(jù)都存儲(chǔ)在葉子結(jié)點(diǎn)中,分支結(jié)點(diǎn)均為索引,方便掃庫(kù),只需要掃一遍葉子結(jié)點(diǎn)即可,但是B樹(shù)因?yàn)槠浞种ЫY(jié)點(diǎn)同樣存儲(chǔ)著數(shù)據(jù),我們要找到具體的數(shù)據(jù),需要進(jìn)行一次中序遍歷按序來(lái)掃,所以B+樹(shù)更加適合在區(qū)間查詢(xún)的情況,所以通常B+樹(shù)用于數(shù)據(jù)庫(kù)索引。

B+樹(shù)更適合基于范圍的查詢(xún):B樹(shù)在提高了IO性能的同時(shí)并沒(méi)有解決元素遍歷的我效率低下的問(wèn)題,正是為了解決這個(gè)問(wèn)題,B+樹(shù)應(yīng)用而生。B+樹(shù)只需要去遍歷葉子節(jié)點(diǎn)就可以實(shí)現(xiàn)整棵樹(shù)的遍歷。而且在數(shù)據(jù)庫(kù)中基于范圍的查詢(xún)是非常頻繁的,而B(niǎo)樹(shù)不支持這樣的操作或者說(shuō)效率太低。

聯(lián)合索引中的順序

MySQL可以使用多個(gè)字段同時(shí)建立一個(gè)索引,叫做聯(lián)合索引。在聯(lián)合索引中,如果想要命中索引,需要 按照建立索引時(shí)的字段順序挨個(gè)使用,否則無(wú)法命中索引。

具體原因?yàn)? MySQL使用索引時(shí)需要索引有序,假設(shè)現(xiàn)在建立了"name,age,school"的聯(lián)合索引,那么索引的排序?yàn)? 先按照name排序,如果name相同,則按照age排序,如果age的值也相等,則按照school進(jìn)行排序。

當(dāng)進(jìn)行查詢(xún)時(shí),此時(shí)索引僅僅按照name嚴(yán)格有序,因此必須首先使用name字段進(jìn)行等值查詢(xún),之后對(duì)于匹配到的列而言,其按照age字段嚴(yán)格有序,此時(shí)可以使用age字段用做索引查找,以此類(lèi)推。因此在 建立聯(lián)合索引的時(shí)候應(yīng)該注意索引列的順序,一般情況下,將查詢(xún)需求頻繁或者字段選擇性高的列放在前面。此外可以根據(jù)特例的查詢(xún)或者表結(jié)構(gòu)進(jìn)行單獨(dú)的調(diào)整。

MySQL的最左前綴原則

最左前綴原則就是最左優(yōu)先,在創(chuàng)建多列索引時(shí),要根據(jù)業(yè)務(wù)需求,where子句中使用最頻繁的一列放在最左邊。

  • mysql會(huì)一直向右匹配直到遇到范圍查詢(xún)(>、 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用 到,a,b,d的順序可以任意調(diào)整。
  • =和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢(xún)優(yōu)化器會(huì)幫 你優(yōu)化成索引可以識(shí)別的形式。

在設(shè)計(jì)索引時(shí)要考慮使用最左前綴原則,將最常用的列放在最左邊。這樣可以使索引更加高效,查詢(xún)速度更快。

查看表的索引信息

SHOW INDEX FROM 表名;

怎么判斷要不要加索引

  • 當(dāng)唯一性是某種數(shù)據(jù)特征的時(shí)候加唯一索引。需要判斷定義列的完整性,以此提高查詢(xún)速度。
  • 在頻繁的進(jìn)行分組或者排序時(shí)(即建立group by / order by )的列上建立索引,如果待排序的列有多個(gè),可以進(jìn)行組合索引。

所有的字段都適合建索引嗎

  1. 數(shù)據(jù)較少的表
  2. 頻繁更新的字段
  3. 數(shù)據(jù)比較重復(fù)的字段,比如性別、真假值
  4. where條件中用不到的字段不需要建立索引
  5. 參與列計(jì)算的列

如何評(píng)估一個(gè)索引創(chuàng)建的是否合理??索引在哪些情況下會(huì)失效??如何避免索引失效?

(1)對(duì)列進(jìn)行計(jì)算或者是使用函數(shù),則該列的索引會(huì)失效

(2)不匹配數(shù)據(jù)類(lèi)型,會(huì)造成索引失效

(3)where語(yǔ)句中使用了IS NULL或者IS NOT NULL,會(huì)造成索引失效

(4)使用了反向操作,該索引將不起作用

(5)使用了link操作,索引就將不起作用

(6)在WHERE中使用OR時(shí),有一個(gè)列沒(méi)有索引,那么其它列的索引將不起作用

如何判斷數(shù)據(jù)庫(kù)的索引有沒(méi)有生效?

通過(guò)explain

索引是用來(lái)干什么的

給信息分配一個(gè)id,方便能夠快速找尋到該數(shù)據(jù)

索引的使用的場(chǎng)景

通常情況下,應(yīng)該為需要經(jīng)常進(jìn)行查詢(xún)的列創(chuàng)建索引,特別是那些數(shù)據(jù)量較大的列。使用索引可以顯著提高查詢(xún)效率。但是,在創(chuàng)建索引的時(shí)候,需要注意索引會(huì)增加數(shù)據(jù)表的存儲(chǔ)空間和數(shù)據(jù)修改的成本,因此不能為所有列都創(chuàng)建索引。

以下是創(chuàng)建索引的一些建議:

  • 主鍵應(yīng)該是唯一的,且自動(dòng)遞增的,因此默認(rèn)會(huì)創(chuàng)建主鍵索引。
  • 對(duì)經(jīng)常用于搜索條件的列進(jìn)行索引,如where和join語(yǔ)句中使用的列。
  • 列值不重復(fù)或者重復(fù)很少的列上創(chuàng)建索引,如性別、狀態(tài)等列。
  • 對(duì)經(jīng)常需要排序的列進(jìn)行索引。

需要注意的是,索引并不是萬(wàn)能的,也并不是越多越好。在數(shù)據(jù)量比較小的情況下,無(wú)索引查詢(xún)的效率可能比使用索引還要高;在數(shù)據(jù)修改和寫(xiě)入比較頻繁的表中,創(chuàng)建過(guò)多的索引會(huì)影響數(shù)據(jù)的修改和寫(xiě)入性能,因此需要權(quán)衡索引的使用和維護(hù)成本,選擇合適的索引策略。

事務(wù)的概念

MySQL 事務(wù)是指一組操作,是一個(gè)不可分割的工作單位,可以確保一組數(shù)據(jù)庫(kù)操作要么全部執(zhí)行,要么全部不執(zhí)行。換句話(huà)說(shuō),事務(wù)是 MySQL 中保證數(shù)據(jù)一致性和完整性的機(jī)制。

在 MySQL 中,事務(wù)可以用來(lái)保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性和完整性,例如在向數(shù)據(jù)庫(kù)中插入或更新一組數(shù)據(jù)時(shí),要么所有數(shù)據(jù)插入或更新成功,要么所有操作全部回滾,保持?jǐn)?shù)據(jù)的原樣。

事務(wù)原子性如何保證

在執(zhí)行到第二個(gè)SQL之前,是無(wú)法預(yù)料這次執(zhí)行會(huì)失敗(假設(shè)執(zhí)行到第二個(gè)會(huì)失敗)
因此,當(dāng)出現(xiàn)執(zhí)行失敗后,有數(shù)據(jù)庫(kù)執(zhí)行一些“還原”操作,來(lái)消除前面SQL帶來(lái)的影響。這個(gè)還原性的操作,叫做“回滾”。
因而外面看起來(lái):當(dāng)執(zhí)行失敗時(shí),一個(gè)都沒(méi)有執(zhí)行。

MySQL 事務(wù)的 ACID 特性

ACID 是事務(wù)處理中的關(guān)鍵概念,它指的是:

  • 原子性:指事務(wù)中的操作要么全部執(zhí)行成功、要么全部失敗回滾,不會(huì)出現(xiàn)部分執(zhí)行的情況。
  • 一致性:指在事務(wù)開(kāi)始和結(jié)束后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞,也就是說(shuō)事務(wù)執(zhí)行前后都需要滿(mǎn)足一些預(yù)定義的約束條件。
  • 隔離性:指一個(gè)事務(wù)中的執(zhí)行不受其他并發(fā)事務(wù)的影響,它們之間是相互隔離的。
  • 持久性:指在事務(wù)提交之后,對(duì)數(shù)據(jù)的更新就被永久寫(xiě)入數(shù)據(jù)庫(kù),即使數(shù)據(jù)庫(kù)出現(xiàn)故障也能夠恢復(fù)。

?事務(wù)的使用

  1. 開(kāi)啟事務(wù):start transaction;
  2. 執(zhí)行多條SQL
  3. 回滾或提交:rollback ,commit

說(shuō)明:rollback即是全部失敗,commit即是全部成功

MySQL中事務(wù)的隔離級(jí)別

隔離級(jí)別是指在并發(fā)情況下,不同事務(wù)之間對(duì)數(shù)據(jù)庫(kù)操作數(shù)據(jù)的可見(jiàn)性和影響范圍的規(guī)定。 MySQL 支持以下四種隔離級(jí)別:

  • 讀未提交:一個(gè)事務(wù)所做的修改,即使沒(méi)有提交,對(duì)其他事務(wù)也是可見(jiàn)的。在這種隔離級(jí)別下可能會(huì)出現(xiàn)臟讀和不可重復(fù)讀問(wèn)題。
  • 讀已提交:一個(gè)事務(wù)所做的修改,在提交后才會(huì)對(duì)其他事務(wù)可見(jiàn),同樣可能會(huì)出現(xiàn)不可重復(fù)讀問(wèn)題。
  • 可重復(fù)讀:保證了在同一個(gè)事務(wù)中對(duì)同一數(shù)據(jù)的讀取是一致的,不受其他事務(wù)的影響。但是,可能會(huì)出現(xiàn)幻讀問(wèn)題。
  • 序列化:最嚴(yán)格的隔離級(jí)別,它通過(guò)對(duì)所有事務(wù)進(jìn)行串行化執(zhí)行來(lái)保證事務(wù)的隔離性。這種隔離級(jí)別能夠避免所有并發(fā)問(wèn)題,但是會(huì)對(duì)數(shù)據(jù)庫(kù)性能產(chǎn)生較大影響。

在選擇隔離級(jí)別時(shí),需要根據(jù)應(yīng)用的實(shí)際情況和數(shù)據(jù)安全性要求來(lái)選擇,即需要權(quán)衡數(shù)據(jù)安全性和數(shù)據(jù)庫(kù)性能。通常情況下,可重復(fù)讀已經(jīng)能夠滿(mǎn)足大部分應(yīng)用需求。

臟讀、不可重復(fù)讀、幻讀

處理臟讀:在寫(xiě)的過(guò)程中,別人就不能讀了(加鎖的狀態(tài))等修改完了之后,別人才能讀(解除加鎖)?

處理不可重復(fù)讀:給讀加鎖,讀的時(shí)候不能寫(xiě),就解決了不可重復(fù)讀的問(wèn)題。?

?處理幻讀:串行化完成事務(wù),即:寫(xiě)——>讀——>寫(xiě)——>讀

一個(gè)事務(wù)在執(zhí)行中,讀到另一個(gè)執(zhí)行中事務(wù)的更新 ( 或其他操作 ) 但是未 commit 的數(shù)據(jù),這種現(xiàn)象叫做臟讀
同一個(gè)事務(wù)內(nèi),同樣的讀取,在不同的時(shí)間段(依舊還在事務(wù)操作中! ) ,讀取到了不同的值,這種現(xiàn)象叫做不可重復(fù)讀
數(shù)據(jù)在可重復(fù)讀情況被讀取出來(lái),導(dǎo)致多次查找時(shí),會(huì)多查找出來(lái)新的記錄,就如同產(chǎn)生了幻覺(jué)。這種現(xiàn)象,叫做幻讀
http://m.aloenet.com.cn/news/38615.html

相關(guān)文章:

  • 什么是php動(dòng)態(tài)網(wǎng)站開(kāi)發(fā)知名的網(wǎng)絡(luò)推廣
  • 金藏源電商網(wǎng)站建設(shè)怎樣免費(fèi)制作網(wǎng)頁(yè)
  • 時(shí)尚網(wǎng)站哪里有整站優(yōu)化
  • 上海企業(yè)網(wǎng)站建設(shè)公谷歌paypal官網(wǎng)注冊(cè)入口
  • 可以做商城網(wǎng)站的公司嗎中國(guó)國(guó)家培訓(xùn)網(wǎng)官網(wǎng)入口
  • 網(wǎng)站背景css培訓(xùn)心得簡(jiǎn)短
  • 科技網(wǎng)站設(shè)計(jì)公司西安網(wǎng)站建設(shè)哪家好
  • 福建省建設(shè)執(zhí)業(yè)繼續(xù)教育網(wǎng)站百度關(guān)鍵詞點(diǎn)擊器
  • 做網(wǎng)站收藏的網(wǎng)頁(yè)搜索熱門(mén)關(guān)鍵詞
  • 做棋牌網(wǎng)站賺錢(qián)嗎域名查詢(xún)網(wǎng)入口
  • wordpress 外貿(mào)站主題seo管理是什么
  • 國(guó)家工業(yè)和信息化部網(wǎng)站備案系統(tǒng)中國(guó)十大電商培訓(xùn)機(jī)構(gòu)
  • 北京網(wǎng)站建設(shè) 一流seo外包服務(wù)
  • 宿松網(wǎng)站建設(shè)青島關(guān)鍵詞排名哪家好
  • 北京上海網(wǎng)站建設(shè)無(wú)經(jīng)驗(yàn)?zāi)茏鰏em專(zhuān)員
  • dremrever怎么做網(wǎng)站網(wǎng)店如何做推廣
  • 網(wǎng)站怎么做構(gòu)成網(wǎng)址查詢(xún)工具
  • 網(wǎng)站建設(shè)教程多少錢(qián)sem和seo有什么區(qū)別
  • 單頁(yè)面網(wǎng)站好優(yōu)化嗎成人職業(yè)技能培訓(xùn)有哪些項(xiàng)目
  • 動(dòng)漫制作專(zhuān)業(yè)簡(jiǎn)介桂林網(wǎng)站優(yōu)化
  • 南陽(yáng)最新通知今天我贏(yíng)網(wǎng)seo優(yōu)化網(wǎng)站
  • 大數(shù)據(jù)對(duì)網(wǎng)站建設(shè)教育的影響企業(yè)推廣宣傳方案
  • 做網(wǎng)站主機(jī)客戶(hù)管理系統(tǒng)
  • yourphp企業(yè)網(wǎng)站管理系統(tǒng)360優(yōu)化大師舊版本
  • 為什么網(wǎng)站需要維護(hù)怎樣免費(fèi)推廣自己的網(wǎng)站
  • 蘇州公司辦理深圳seo論壇
  • 有趣網(wǎng)站開(kāi)發(fā)手機(jī)百度助手
  • 游戲網(wǎng)頁(yè)版谷歌廣告優(yōu)化師
  • 網(wǎng)上做涉黃網(wǎng)站怎么判北京網(wǎng)聘咨詢(xún)有限公司
  • 網(wǎng)站首頁(yè)輪播百度搜索指數(shù)的數(shù)據(jù)來(lái)源