1蕾殴、上周復(fù)習(xí)
1.1彭羹、索引
1.1.1黄伊、聚集索引構(gòu)建B樹的過(guò)程
1.1.2、輔助索引構(gòu)建B樹的過(guò)程
1.1.3派殷、面試題簡(jiǎn)易回答
1)一張表只能有一個(gè)聚集索引还最,最好是自增的數(shù)字列
2)聚集索引葉子節(jié)點(diǎn)有序存儲(chǔ)的整行數(shù)據(jù)
3)輔助索引一個(gè)表可以有多個(gè)
4)輔助索引葉子節(jié)點(diǎn)存儲(chǔ)的是索引列的有序值+此列值的主鍵值
1.1.4、輔助索引細(xì)分
1)單列輔助索引
2)多列聯(lián)合索引
--- select xxxx from where a b c 都是等值查詢愈腾,建索引有什么好的建議
1.考慮聯(lián)合索引
2.排列問題憋活,唯一值多的放在
alter table t1 add idx(c,b,a)
select count(distinct a) from t1;
為什么岂津?
優(yōu)化器會(huì)自動(dòng)按照索引建立的順序虱黄,自動(dòng)排列where條件的順序,前提都是等值或者in的吮成。
如果出現(xiàn)其他方式條件,比如:
出現(xiàn)了> < 或者group by order by
怎么判斷聯(lián)合索引帶來(lái)的優(yōu)化效果橱乱?
1.看執(zhí)行計(jì)劃
2.key_len
3)唯一索引
1.1.5、索引樹高度問題(索引樹高度受哪些原因影響粱甫?)開發(fā)規(guī)范
1)數(shù)據(jù)類型:char和varchar enum
2) 數(shù)據(jù)量級(jí)問題:分庫(kù)泳叠、分表、分布式
3)索引列值長(zhǎng)度:前綴索引
1.2茶宵、explain(desc)重點(diǎn)回顧
1.2.1危纫、你在你們公司做過(guò)哪些優(yōu)化(mysql)?
1)我在公司主要是配合開發(fā)和業(yè)務(wù)人員,進(jìn)行SQL優(yōu)化和索引優(yōu)化這塊的工作
2)我主要是針對(duì)索引優(yōu)化种蝶,這塊做的比較多
3)我一般都是針對(duì)兩個(gè)數(shù)據(jù)庫(kù)工具進(jìn)行配優(yōu)化
4)第一個(gè)就是slowlog(自動(dòng)收集慢語(yǔ)句)契耿,第二個(gè)工具就是explain
5)我通過(guò)之前做過(guò)的小案列來(lái)簡(jiǎn)單說(shuō)明下我的優(yōu)化思路
6)explain(desc)使用場(chǎng)景(面試題)
題目意思:我們公司業(yè)務(wù)慢,請(qǐng)你從數(shù)據(jù)庫(kù)的角度分析原因
1螃征、MySQL突然出現(xiàn)性能問題搪桂,我總結(jié)有兩種情況:
1)應(yīng)急性的慢:突然夯住
應(yīng)急情況:數(shù)據(jù)庫(kù)夯住(卡了盯滚,資源耗盡)
處理過(guò)程:
1踢械、show processlist獲取導(dǎo)致數(shù)據(jù)庫(kù)hang住的SQL語(yǔ)句
2、explain,分析SQL的執(zhí)行計(jì)劃魄藕,檢查有沒有走索引内列,索引的類型情況
3、建索引背率,改語(yǔ)句
2)一段時(shí)間的慢(持續(xù)性的):
1德绿、記錄慢日志slowlog,分析slowlog
2、explain,分析SQL的執(zhí)行計(jì)劃退渗,檢查有沒有走索引移稳,索引的類型情況
3、建索引会油,改語(yǔ)句
7个粱、另外我還做一步存儲(chǔ)引擎方面的優(yōu)化
我們有個(gè)業(yè)務(wù)是插入類的操作比較多,做過(guò)一個(gè)存儲(chǔ)引擎方面的優(yōu)化
將innodb替換成tokudb
主要說(shuō)說(shuō)為什么會(huì)使用tokudb
1.3翻翩、存儲(chǔ)引擎
1.3.1都许、innodb存儲(chǔ)引擎核心特性
事務(wù)
外鍵
熱備份
MVCC
CSR
1.3.2、表空間管理
alter table tb1 discard tablespace;
alter table tb1 import tablespace;
1.3.3嫂冻、事務(wù)特性
A 原子性
C 一致性
I 隔離性
D 持久性
1.3.4胶征、redo在ACID中的作用
重做日志,前滾日志桨仿。主要完成ACID中的D特性睛低,對(duì)AC也有一定的作用
存什么?
內(nèi)存數(shù)據(jù)頁(yè)變化的過(guò)程
1.3.5服傍、UNDO在ACID中的作用
回滾日志钱雷,撤銷日志。主要完成ACID中的D吹零,對(duì)CI也有一定作用
1.3.6罩抗、redo-CSR前滾
MySQL : 在啟動(dòng)時(shí),必須保證redo日志文件和數(shù)據(jù)文件LSN必須一致, 如果不一致就會(huì)觸發(fā)CSR,最終保證一致
情況一:
我們做了一個(gè)事務(wù),begin;update;commit.
1.在begin ,會(huì)立即分配一個(gè)TXID=tx_01.
2.update時(shí),會(huì)將需要修改的數(shù)據(jù)頁(yè)(dp_01,LSN=101),加載到data buffer中
3.DBWR線程,會(huì)進(jìn)行dp_01數(shù)據(jù)頁(yè)修改更新,并更新LSN=102
4.LOGBWR日志寫線程,會(huì)將dp_01數(shù)據(jù)頁(yè)的變化+LSN+TXID存儲(chǔ)到redobuffer
5. 執(zhí)行commit時(shí),LGWR日志寫線程會(huì)將redobuffer信息寫入redolog日志文件中,基于WAL原則,
在日志完全寫入磁盤后,commit命令才執(zhí)行成功,(會(huì)將此日志打上commit標(biāo)記)
6.假如此時(shí)宕機(jī),內(nèi)存臟頁(yè)沒有來(lái)得及寫入磁盤,內(nèi)存數(shù)據(jù)全部丟失
7.MySQL再次重啟時(shí),必須要redolog和磁盤數(shù)據(jù)頁(yè)的LSN是一致的.但是,此時(shí)dp_01,TXID=tx_01磁盤是LSN=101,dp_01,TXID=tx_01,redolog中LSN=102
MySQL此時(shí)無(wú)法正常啟動(dòng),MySQL觸發(fā)CSR.在內(nèi)存追平LSN號(hào),觸發(fā)ckpt,將內(nèi)存數(shù)據(jù)頁(yè)更新到磁盤,從而保證磁盤數(shù)據(jù)頁(yè)和redolog LSN一值.這時(shí)MySQL正長(zhǎng)啟動(dòng)
以上的工作過(guò)程,我們把它稱之為基于REDO的"前滾操作"
1.3.7、undo-CSR回滾
2.鎖介紹
2.1灿椅、介紹
鎖定的意思套蒂,提供的是ACID中I方面的功能钞支。需要配合undo+隔離級(jí)別一起來(lái)實(shí)現(xiàn)
2.2、INNODB鎖級(jí)別
行級(jí)鎖
2.3操刀、擴(kuò)展內(nèi)容
Next LOCK
GAP LOCK
悲觀鎖:
樂觀鎖:
工作中(優(yōu)化章節(jié)):需要排查鎖的爭(zhēng)用伸辟、鎖等待、死鎖
3馍刮、事務(wù)的隔離級(jí)別
影響到數(shù)據(jù)的讀取信夫,默認(rèn)的級(jí)別是 RR模式。
transaction_isolation 隔離級(jí)別(參數(shù))
負(fù)責(zé)的是卡啰,MVCC静稻,讀一致性問題
RR級(jí)別:解決了不可重復(fù)讀問題+幻讀的現(xiàn)象
不可重復(fù)讀問題是由undo的快照技術(shù)來(lái)解決。
幻讀現(xiàn)象是由:MVCC+GAP+next-lock
RC級(jí)別:讀已提交匈辱,可能出現(xiàn)幻讀振湾,可以防止臟讀
RU:讀未提交,可臟讀亡脸,一般不允許出現(xiàn)
SR:可串行化押搪,可以防止死鎖,但是并發(fā)事務(wù)性能較差
補(bǔ)充: 在RC級(jí)別下,可以減輕GAP+NextLock鎖的問題,但是會(huì)出現(xiàn)幻讀現(xiàn)象,一般在為了讀一致性會(huì)在正常
select后添加for update語(yǔ)句.但是,請(qǐng)記住執(zhí)行完一定要commit 否則容易出現(xiàn)所等待比較嚴(yán)重.
例如:
[world]>select * from city where id=999 for update;
[world]>commit;
4浅碾、INNODB核心參數(shù)
4.1大州、雙一標(biāo)準(zhǔn)之一:innodb_flush_log_at_trx_commit=1
作用:控制了redo buffer刷寫策略,是一個(gè)安全參數(shù)垂谢,實(shí)在5.6版本以上默認(rèn)的參數(shù)
等于1:每次事務(wù)提交厦画,都會(huì)立即刷下redo到磁盤(redo buffer ----每事務(wù)----> os buffer
----每事務(wù)---->磁盤)
等于0:每次當(dāng)事務(wù)提交時(shí)。不做日志寫入操作(redo buffer ----每秒----> os buffer
----每秒---->磁盤)
等于2:每次事務(wù)提交引起寫入文件系統(tǒng)緩存 (redo buffer ----每事務(wù)----> os buffer
----每秒---->磁盤)
4.2滥朱、innodb_flush_method=(O_DIRECT,fdatasync);
作用:控制了redo buffer 和 data buffer 刷寫磁盤方式
最大安全模式:
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
最大性能模式:
innodb_flush_log_at_trx_commit=0
innodb_flush_method=fsync
4.3根暑、關(guān)于redo設(shè)置
innodb_log_buffer_size=128M 起 和業(yè)務(wù)系統(tǒng)cpu壓力有關(guān)
innodb_log_file_size=256 一般是1~2倍
innodb_log_files_in_group = 3 一般是3~4組
4.4、innodb_buffer_pool_size
一般調(diào)整為物理內(nèi)存的50~80%左右(你的系統(tǒng)中只有一個(gè)mysql實(shí)例)