MySql索引和事務(wù)定義到使用全面涵蓋
索引是什么
索引是一種特殊的文件,包含著對數(shù)據(jù)表里所有記錄的引用指針??梢詫Ρ碇械囊涣谢蚨嗔袆?chuàng)建索引,并指定索引的類型,各類索引有各自的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。索引就相當(dāng)于一本書的目錄,通過索引 可快速定位、檢索數(shù)據(jù)。使用索引大大提高了查找效率,但同時索引也占用了更多的空間,拖慢了增刪改的速度。
索引的使用場景
1、數(shù)據(jù)量較大,且經(jīng)常對這些列進行條件查詢。
2、該數(shù)據(jù)庫表的插入操作,及對這些列的修改操作頻率較低。
3、索引會占用額外的磁盤空間。
滿足以上條件時,考慮對表中的這些字段創(chuàng)建索引,以提高查詢效率。
反之,如果非條件查詢列,或經(jīng)常做插入、修改操作,或磁盤空間不足時,不考慮創(chuàng)建索引。
索引的常見操作
1、創(chuàng)建索引 對于非主鍵、非唯一約束、非外鍵的字段,可以創(chuàng)建普通索引。
create index 索引名 on 表名(字段名);
2、查看索引
show index from 表名;
3、刪除索引
drop index 索引名 on 表名;
索引背后的數(shù)據(jù)結(jié)構(gòu)
索引背后的數(shù)據(jù)結(jié)構(gòu)是B+樹。
B+樹優(yōu)勢:
1、使用B+樹進行查找的時候整體的磁盤IO次數(shù)是比較少的。
2、所有的查詢最終都會落到葉子節(jié)點上,每次查詢的磁盤IO次數(shù)都是差不多的,查詢速度比較穩(wěn)定。
3、葉子結(jié)點用鏈表連接之后,非常適合進行范圍查找。
4、所有的數(shù)據(jù)存儲(載荷)都是放到葉子節(jié)點上的,非葉子節(jié)點中只保存key值即可,因此非葉子節(jié)點整體占用的空間較小,甚至可以緩存到內(nèi)存中(一旦能夠全部放內(nèi)存里,這時候磁盤IO幾乎沒了)。
事務(wù)是什么
事務(wù)指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部失敗。 在不同的環(huán)境中,都可以有事務(wù)。對應(yīng)在數(shù)據(jù)庫中,就是數(shù)據(jù)庫事務(wù)。就是說兩個操作要么都執(zhí)行,要么一個都不執(zhí)行。 就比如說現(xiàn)在有A、B兩個賬戶,兩個賬戶上都有1000元,現(xiàn)在A要給B轉(zhuǎn)500元,那么A賬戶上就要少500元,B賬戶上要多500,兩個操作都要執(zhí)行。不能存在一個執(zhí)行一個不執(zhí)行,要么都不執(zhí)行。 在sql中,如果第一個sql執(zhí)行之后,第二個sql執(zhí)行時出現(xiàn)意外,導(dǎo)致不能執(zhí)行,這時候數(shù)據(jù)庫就會還原操作,讓第一個sql還原到執(zhí)行之前(回滾)。那么數(shù)據(jù)庫是怎么還原的呢?是因為數(shù)據(jù)庫會將執(zhí)行過的每個操作都記錄下來。
? 事務(wù)的相關(guān)操作
1、開啟事務(wù)
start transaction;
2、回滾或提交
rollback/commit; //rollback即是全部失敗,commit即是全部成功。
事務(wù)的基本特性
1、原子性
原子性是指兩個操作要么全部都執(zhí)行,要么一個都不執(zhí)行,操作不可再細分了。
2、一致性
一致性是指數(shù)據(jù)庫的數(shù)據(jù)在事務(wù)執(zhí)行之前和之后都要是合理合法的。(例如上面的轉(zhuǎn)賬,賬戶不能出現(xiàn)負數(shù)的情況)
3、持久性
持久性是指事務(wù)一旦被提交之后,數(shù)據(jù)就被寫入硬盤,持久化的存儲起來了。
4、隔離性
隔離性是指事務(wù)并發(fā)執(zhí)行時產(chǎn)生的情況。
事務(wù)并發(fā)執(zhí)行是指多個事務(wù)同時執(zhí)行,多個事務(wù)并發(fā)執(zhí)行時,尤其時多個事務(wù)在嘗試修改、讀取同一份數(shù)據(jù)時,很容易出現(xiàn)一些問題,隔離性就是在處理這些問題。
?并發(fā)執(zhí)行事務(wù)可能帶來的問題:
1、臟讀問題
事務(wù)A正在輸入某些數(shù)據(jù),這是事務(wù)B過來讀取了事務(wù)A正在輸入的數(shù)據(jù),然后B回去按照A的數(shù)據(jù)進行輸入,若事務(wù)A在事務(wù)B讀取數(shù)據(jù)之后對數(shù)據(jù)進行了修改,這時候事務(wù)B讀到的數(shù)據(jù)就有可能是一個"臟數(shù)據(jù)"(這個數(shù)據(jù)只是一個臨時的的結(jié)果,而不是最終結(jié)果),這就是臟讀問題。
如何處理臟讀問題?
在寫數(shù)據(jù)的時候進行加鎖處理,等A完全寫完修改完之后再讓B看,這時候事務(wù)之間的隔離性就提高了,但同時并發(fā)性也降低了。
2、不可重復(fù)讀問題
按照以上處理,等到A全部寫完B再看,但是如果A在B讀的時候又修改了代碼,這時候B再回過頭來看,數(shù)據(jù)又不一樣了,不能重復(fù)讀這個數(shù)據(jù),這怎么辦?這時候干脆就將讀也加上鎖,在A寫入數(shù)據(jù)的時候B不能讀,在B讀數(shù)據(jù)的時候A也不能修改。這時候事務(wù)的隔離性又提高了,并發(fā)性又降低了。
3、幻讀問題
以上兩個操作,給讀和寫都加上了鎖,雖然它的隔離性提高了,但是卻降低了效率,導(dǎo)致讀和寫的時間都變得更長了起來,這時候在寫或者讀的過程事務(wù)可以去改其他表或者這個表的其他行(事務(wù)雖然在提交隔離性時進行了一系列的加鎖,但是并沒有把整個數(shù)據(jù)庫給鎖定了),這時候B在讀數(shù)據(jù)的時候會發(fā)現(xiàn)數(shù)據(jù)數(shù)量變了,本來只有一個A.java,現(xiàn)在又多了個B.java,這就是幻讀問題。總的來說就是一個事務(wù)執(zhí)行過程中進行多次查詢,每次查詢的結(jié)果集不一樣(多或者少),這也是一種特殊的不可重復(fù)讀問題。
該如何解決呢?
事務(wù)串行化執(zhí)行。(串行化執(zhí)行就是事務(wù)一個一個執(zhí)行)
通過以上我們也知道了隔離性和并發(fā)性不能同時得到,要想提高隔離性,并發(fā)性就得降低。
進行了以上修改,這時候隔離性程度最高,并發(fā)性程度最低,數(shù)據(jù)最可靠,速度也最慢。
?根據(jù)以上總結(jié),MySQL中事務(wù)的隔離級別,提供了以下這幾種:
1. read uncommitted:允許讀取未提交的數(shù)據(jù),并發(fā)程度最高,隔離程度最低,會引入臟讀、不可重復(fù)讀、幻讀問題。
2. read committed:只允許讀取提交之后的數(shù)據(jù),相當(dāng)于寫加鎖,并發(fā)程度降低了一些,隔離程度提高了一些, 解決了臟讀,會引入不可重復(fù)讀和幻讀。
3. repeatable read:相當(dāng)于給讀和寫都加鎖,并發(fā)程度又降低了,隔離程度又提高了,解決了臟讀和不可重復(fù)度,會引入幻讀。
4. serializable:串行化,并發(fā)程度最低(串行執(zhí)行),隔離程度最高,解決了臟讀,不可重復(fù)度,幻讀問題,但是執(zhí)行速度最慢。
小結(jié)
這里主要掌握索引是什么,它的適用場景,付出了什么代價以及索引背后的數(shù)據(jù)結(jié)構(gòu),事務(wù)的四個基本特性。
到此這篇關(guān)于MySql索引和事務(wù)定義到使用全面涵蓋的文章就介紹到這了,更多相關(guān)MySql索引和事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql中流程控制函數(shù)/統(tǒng)計函數(shù)/分組查詢用法解析
這篇文章主要介紹了MySql中流程控制函數(shù)/統(tǒng)計函數(shù)/分組查詢用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07MySQL?到?ClickHouse?實時數(shù)據(jù)同步實操
這篇文章主要分享的是MySQL?到?ClickHouse?實時數(shù)據(jù)同步實操,小編測試了測了一種方式,可以非常方便地完成?MySQL?數(shù)據(jù)實時同步到ClickHouse,跟大家分享一下,希望對你有幫助2022-01-01Java數(shù)據(jù)類型與MySql數(shù)據(jù)類型對照表
這篇文章主要介紹了Java數(shù)據(jù)類型與MySql數(shù)據(jù)類型對照表,以表格形式分析了java與mysql對應(yīng)數(shù)據(jù)類型,并簡單講述了數(shù)據(jù)類型的選擇與使用方法,需要的朋友可以參考下2016-06-06mysql5.7數(shù)據(jù)庫安裝完成后如何配置環(huán)境變量
這篇文章主要為大家詳細介紹了在win10系統(tǒng)下,mysql5.7數(shù)據(jù)庫安裝完成后配置環(huán)境變量的具體步驟,感興趣的小伙伴們可以參考一下2016-06-06linux下導(dǎo)入、導(dǎo)出mysql數(shù)據(jù)庫命令的實現(xiàn)方法
下面小編就為大家分享一篇linux下導(dǎo)入、導(dǎo)出mysql數(shù)據(jù)庫命令的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12SQL Server COALESCE函數(shù)詳解及實例
這篇文章主要介紹了SQL Server COALESCE函數(shù)詳解及實例的相關(guān)資料,COALESCE函數(shù)比ISNULL更加強大,這個函數(shù)的確非常有用,需要的朋友可以參考下2016-12-12