InnoDB理解&面試

批量執(zhí)行插入操作是對(duì)數(shù)據(jù)庫(kù)的優(yōu)化

InnoDB是mysql下的默認(rèn)存儲(chǔ)引擎:

a) 支持ACID,簡(jiǎn)單地說(shuō)就是支持事務(wù)完整性、一致性;

b) 支持行鎖,以及類似ORACLE的一致性讀,多用戶并發(fā);

c) 獨(dú)有的聚集索引主鍵設(shè)計(jì)方式,可大幅提升并發(fā)讀寫性能

原子性:

一個(gè)事務(wù)要么全做,要么不做,主要保證機(jī)制是undo日志

undo日志記錄操作的逆向操作,insert操作記錄delete操作,當(dāng)事務(wù)失敗回滾時(shí)候則執(zhí)行undo日志中的內(nèi)容就可以將數(shù)據(jù)庫(kù)恢復(fù)到原有狀態(tài),實(shí)現(xiàn)原子性

持久性:

指事務(wù)一旦提交,對(duì)于數(shù)據(jù)庫(kù)的影響就是一直存在的

主要靠redo日志來(lái)實(shí)現(xiàn),每個(gè)事務(wù)執(zhí)行時(shí)候會(huì)刷入redo日志,當(dāng)數(shù)據(jù)庫(kù)下次重啟時(shí)候直接讀取redo日志就可以恢復(fù)數(shù)據(jù)庫(kù)

隔離性:

兩個(gè)事務(wù)操作互不影響

依靠鎖機(jī)制(寫寫)與mvcc(寫讀)

innodb實(shí)現(xiàn)行鎖

innodb支持行鎖,通過(guò)索引實(shí)現(xiàn)

·未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會(huì)話中未提交事務(wù)修改的數(shù)據(jù)

·提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫(kù)默認(rèn)都是該級(jí)別 (不重復(fù)讀)

·可重復(fù)讀(Repeated Read):可重復(fù)讀。在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開(kāi)始時(shí)刻一致的,InnoDB默認(rèn)級(jí)別。在SQL標(biāo)準(zhǔn)中,該隔離級(jí)別消除了不可重復(fù)讀,但是還存在幻象讀

·串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級(jí)共享鎖,讀寫相互都會(huì)阻塞

臟讀:

一個(gè)事務(wù)在修改數(shù)據(jù)庫(kù),另一個(gè)事務(wù)在讀取數(shù)據(jù)庫(kù)內(nèi)容,這時(shí)候會(huì)出現(xiàn)臟讀

不可重復(fù)讀:

一個(gè)事務(wù)連續(xù)兩次在讀取數(shù)據(jù)庫(kù),另一個(gè)事務(wù)在這時(shí)候修改了內(nèi)容,導(dǎo)致讀取的內(nèi)容不一致

幻讀:

事務(wù)首先查找數(shù)據(jù)庫(kù)發(fā)現(xiàn)沒(méi)有? 一行,然后準(zhǔn)備執(zhí)行插入操作,結(jié)果另一個(gè)事務(wù)在這一時(shí)刻進(jìn)行插入操作,第一條事務(wù)操作失敗,就像出現(xiàn)了幻覺(jué)。

聚集索引與非聚集索引:

聚集索引直接指向存儲(chǔ)的物理地址

非聚集索引指向一個(gè)數(shù)據(jù)庫(kù),如果需要查詢其他的內(nèi)容,需要進(jìn)行二次查詢,通過(guò)建立符合索引來(lái)解決二次查詢問(wèn)題

由于索引是b樹(shù)或者b+樹(shù)結(jié)構(gòu),因此每次增刪改都會(huì)重建索引

mysql日志系統(tǒng):

redo日志,undo日志,binlog日志,慢查詢?nèi)罩?,錯(cuò)誤日志

redo日志:是數(shù)據(jù)格式,為了防止事務(wù)未寫入磁盤重做的日志,對(duì)應(yīng)事務(wù)臟頁(yè)寫入磁盤,就撤銷

undo日志:記錄事務(wù)提交之前的狀態(tài),是邏輯格式的日志,用于回滾事務(wù)操作

binlog:是邏輯格式的日志,用于主從復(fù)制,每一段時(shí)間從庫(kù)通過(guò)執(zhí)行binlog來(lái)保持與主庫(kù)相同,事務(wù)提交后記錄,一次性寫入磁盤。

mvcc實(shí)現(xiàn):

使用版本代替鎖的概念

默認(rèn)隔離級(jí)別是可重復(fù)讀

隔離級(jí)別實(shí)現(xiàn)方式:樂(lè)觀鎖和悲觀鎖。

鎖機(jī)制存在的問(wèn)題:如果加了鎖之后,沒(méi)辦法取讀取數(shù)據(jù)

樂(lè)觀鎖:mvcc的版本的概念,在每一行加入版本的概念,使用快照數(shù)據(jù),根據(jù)事務(wù)id來(lái)進(jìn)行訪問(wèn)控制

mvcc讀取原理:

只能讀取到小于當(dāng)前版本號(hào)的內(nèi)容信息

插入和刪除操作則選擇時(shí)間點(diǎn)之前的版本號(hào)

如果一個(gè)事務(wù)是1,2版本持續(xù)查詢

另一個(gè)事務(wù)執(zhí)行插入和刪除操作,那么會(huì)讀取仍然是事務(wù)id為1的內(nèi)容

mysql優(yōu)化:

1.表結(jié)構(gòu)優(yōu)化(選擇優(yōu)化類型)

scheam優(yōu)化

范式與反范式

blob與text

2.索引優(yōu)化

索引:

多列索引

選擇合適的索引順序

哈希索引,查找速度相當(dāng)快,但是費(fèi)空間,無(wú)法用于排序

mysam存儲(chǔ)為順序存儲(chǔ),只存了行號(hào)

innodb的聚簇索引就是一張表

按照順序插入防止頁(yè)分裂,比如隨機(jī)數(shù)就不好

減少冗余索引

使用壓縮索引,前綴索引

3.查詢優(yōu)化

查詢不需要的數(shù)據(jù)

分解關(guān)聯(lián)查詢,用小查詢?cè)俅a中做拼接更好

mysql通信協(xié)議是直接把所有結(jié)果推給客戶端

查詢過(guò)程:

首先檢查緩存,如果命中了直接返回結(jié)果

sql語(yǔ)句進(jìn)行語(yǔ)法解析,語(yǔ)義分析

mysql根據(jù)查詢優(yōu)化器生成執(zhí)行計(jì)劃(可以優(yōu)化cont,min,max,轉(zhuǎn)為常數(shù)表達(dá)式)

mysql復(fù)制:

過(guò)程:

1.主庫(kù)把數(shù)據(jù)記錄到二進(jìn)制日志中,每次提交事務(wù)之前,將數(shù)據(jù)記錄到二進(jìn)制日志中

2.備庫(kù)將主庫(kù)的二進(jìn)制日志復(fù)制到自己的中繼日志中

3.備庫(kù)啟動(dòng)一個(gè)異步線程,io線程,與主庫(kù)建立連接,讀取主庫(kù)上的二進(jìn)制日志,將接收到的事件記錄到中繼日志

4.備庫(kù)回復(fù)中繼日志

原理:

1.基于語(yǔ)句的復(fù)制

優(yōu)點(diǎn):更容易理解執(zhí)行過(guò)程,出現(xiàn)問(wèn)題可以很好的定位,比如類型不一樣

缺點(diǎn):很多情況無(wú)法正確復(fù)制,有些語(yǔ)句具有順序性,需要加鎖操作

2.基于行的復(fù)制

優(yōu)點(diǎn):可以進(jìn)行所有情況的復(fù)制,鎖開(kāi)銷小占用更少的cpu

缺點(diǎn):沒(méi)有記錄sql語(yǔ)句,導(dǎo)致查問(wèn)題不知道原因

mysql分區(qū)表:

1、減緩單機(jī)msql表壓力,分散查詢

原理:

1、在執(zhí)行insert,update,delete,select操作都會(huì)鎖住每個(gè)底層表,除去select操作,都是確定好在哪一個(gè)分區(qū),數(shù)據(jù)執(zhí)行完后再解鎖,select操作確定哪一部分分區(qū)表可以排除,然后查詢剩余分區(qū)表。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容