批量執(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ū)表。