1. mysql主從同步的原理,這種方式是同步還是異步?有什么問(wèn)題?是否有可能發(fā)生數(shù)據(jù)丟失?
????????原理:master運(yùn)行時(shí)會(huì)產(chǎn)生binlog,slave通過(guò)單獨(dú)的io線(xiàn)程,不斷的讀取binlog,并將其轉(zhuǎn)化為relaylog(中繼日志)并執(zhí)行relaylog
????????常規(guī)的mysql主從同步是異步同步(使用插件除外)
????????同步過(guò)程中如果發(fā)生宕機(jī)可能會(huì)丟失數(shù)據(jù),引申出半同步
? ? ? ? 詳情參考:mysql-主從同步??http://www.itdecent.cn/p/f08f4265719d
2. mysql熱備的搭建過(guò)程,使用mysqldump會(huì)不會(huì)鎖表??
????????通過(guò)mysqldump先獲取存量數(shù)據(jù)(導(dǎo)出), 然后在slave上配置master信息追binlog流水
????????mysqldump --all-databases --master-data=2 --single-transaction --quick -R --events -uroot > /tmp/full.sql????
? ??????????????--single-transaction:一致性備份(不會(huì)鎖表)
????????????????-q:采用快速的dump方式(提高導(dǎo)出性能)
????????????????-R:導(dǎo)出存儲(chǔ)過(guò)程,函數(shù),和觸發(fā)器
????????????????--events:如果是5.1以上的版本使用,包含事件
????????????????--master-data:在dump過(guò)程中記錄主庫(kù)的binlog和pos點(diǎn)(dump出的文件就會(huì)多出change master to這個(gè)語(yǔ)句),值為1時(shí)這個(gè)語(yǔ)句會(huì)執(zhí)行,值為2時(shí)這個(gè)語(yǔ)句是注釋狀態(tài)
3.?談?wù)剬?duì)數(shù)據(jù)庫(kù)隔離級(jí)別的認(rèn)識(shí)? mysql默認(rèn)的隔離級(jí)別是什么? mysql在默認(rèn)隔離級(jí)別下能防止幻讀嗎??
? ? ? ? 四個(gè)隔離級(jí)別:1.讀未提交????2.不可重復(fù)讀????3.可重復(fù)讀? ? 4.串行化
? ? ? ? mysql的默認(rèn)級(jí)別:RR(可重復(fù)讀)?
????????mysql在可重復(fù)讀隔離級(jí)別(RR)下沒(méi)有完全解決幻讀問(wèn)題,通過(guò)啟用next-key鎖(表鎖和間隙鎖)和MVCC機(jī)制來(lái)避免幻讀。
? ? ? ? ?詳情參考:mysql-事務(wù)?http://www.itdecent.cn/p/f51e1c033ba8
? ? ? ? ? ? ? ? ? ? ? ? ? ?mysql-mvcc??http://www.itdecent.cn/p/2f5b62d9719b
?? ? ? ? ? ? ? ? ? ? ? ? ??mysql-鎖???http://www.itdecent.cn/p/7bfe623cabcf
4.?如果有聯(lián)合索引(field1, field2) , 當(dāng)查詢(xún)語(yǔ)句 select * from test where field2 = xxx; 這個(gè)語(yǔ)句是否可以用到索引? 為什么
????????不能, 最左前綴原則
5. 事務(wù)的四個(gè)特性分別是什么, 請(qǐng)具體介紹一下?
????????ACID(原子性,一致性,隔離性,持久性)
????????注意這里的一致性并不是CAP定理中的一致性
? ??????一致性是指事務(wù)使得系統(tǒng)從一個(gè)一致的狀態(tài)轉(zhuǎn)換到另一個(gè)一致?tīng)顟B(tài)。(我也沒(méi)看懂這句話(huà),大概意思就是倆人轉(zhuǎn)錢(qián),錢(qián)的總數(shù)要保持一致那么個(gè)意思)
6. myisam引擎和innodb引擎的區(qū)別有哪些??
? ??????innodb支持事務(wù),myisam不支持
????????innodb支持外鍵,myisam不支持
????????innodb是聚簇索引(主鍵的索引存儲(chǔ)了主鍵值和數(shù)據(jù),輔助索引存儲(chǔ)了主鍵的值,也就是說(shuō)使用輔助索引會(huì)查詢(xún)兩次),myisam是非聚簇索引(主鍵索引和輔助索引都是指向數(shù)據(jù)的物理位置)
????????innodb是行鎖和表鎖(這里注意行鎖是上在索引上的),myisam是行鎖
????????innodb不支持全文索引(5.7版本之后支持),myisam支持
????????innodb要有主鍵(如果用戶(hù)沒(méi)指定會(huì)生成個(gè)Unique key作為主鍵)myisam可以沒(méi)有主鍵????
????????myisam讀要比innodb快(1.innodb要額外維護(hù)幾個(gè)字段實(shí)現(xiàn)mvcc? 2. innodb尋址要先到頁(yè)然后到行,myisam直接尋址)
????????myisam不適合大量插入(myisam是表鎖,innodb是行鎖)
7. mvcc特性實(shí)現(xiàn)的原理是什么??
? ? ? ? 1 快照讀 2 undolog 3 每行隱藏的創(chuàng)建版本號(hào)與過(guò)期版本號(hào)
? ? ? ? 詳情參考:mysql-mvcc??http://www.itdecent.cn/p/2f5b62d9719b
8. select * from test_table where field = xxx limit 1 for update, 這條語(yǔ)句是什么意思? 如果field字段上沒(méi)有索引, 會(huì)鎖住一條記錄還是全表鎖????
? ? ? ? 加讀鎖(行級(jí)),沒(méi)索引會(huì)鎖全表(再次強(qiáng)調(diào),鎖是鎖的索引)
9. 如何優(yōu)化一條sql, 談?wù)剤?zhí)行計(jì)劃
? ? ? ? explain,不細(xì)說(shuō)
10. redis的持久化方式有哪些? 每種持久化方式的優(yōu)點(diǎn)和缺點(diǎn)是什么?
????????aof 和 rdb。rdb是每隔一段時(shí)間,備份所有數(shù)據(jù)(快照)。aof是記錄命令(增量)。
? ? ? ? 現(xiàn)在redis是采用aof+rdb的方式來(lái)持久化(兩次快照之間使用aof來(lái)持久化,也就是說(shuō)先讀rdb恢復(fù)到上個(gè)時(shí)間節(jié)點(diǎn),然后使用aof增量來(lái)進(jìn)一步恢復(fù))
? ? ? ? rdb優(yōu)缺點(diǎn):優(yōu)點(diǎn):快照備份快,恢復(fù)也快。缺點(diǎn):停機(jī)會(huì)丟失很多數(shù)據(jù)。。。??
? ? ? ? aof優(yōu)缺點(diǎn):優(yōu)點(diǎn):很精確,就算是停機(jī)也就丟幾秒的數(shù)據(jù)。 缺點(diǎn):頻繁fsync(畢竟會(huì)記錄每條命令啊)恢復(fù)也慢
11. mysql為什么要使用b+樹(shù)?
? ? ? ? 同二叉樹(shù)相比,b-樹(shù)更矮胖(m階b+樹(shù),每個(gè)中間節(jié)點(diǎn)包含k-1個(gè)元素并有k個(gè)孩子,每個(gè)葉子節(jié)點(diǎn)包含 k-1個(gè)元素),可以減少I(mǎi)O次數(shù)
? ? ? ? 同b-樹(shù)相比,b+樹(shù)的數(shù)據(jù)只存儲(chǔ)在葉子節(jié)點(diǎn)上。且葉子節(jié)點(diǎn)之間增加了鏈表,這樣獲取節(jié)點(diǎn)時(shí),不用中序遍歷,這樣便于快速定位數(shù)據(jù),是減少磁盤(pán)IO的最佳方式。
12. 索引失效的幾種情況:
????????1.條件中有or,即使其他條件帶索引也不會(huì)使用
????????2.復(fù)合索引未用左列字段;? ??
????????3.like以%開(kāi)頭;?
????????4.需要類(lèi)型轉(zhuǎn)換 (where age = "10" 表中存的是int,但是sql寫(xiě)成string)
????????5.where中索引列有運(yùn)算;
????????6.where中索引列使用了函數(shù);
????????7.如果mysql覺(jué)得全表掃描更快時(shí)(優(yōu)化器會(huì)計(jì)算成本,然后選擇方案,如果結(jié)果集太大,mysql會(huì)認(rèn)為掃描全表更劃算)
13. 超大數(shù)據(jù)量分頁(yè):
? ? ????select * from orders o
????????????inner join
????????????????(select id from?orders where created_at between '2019-10-17' and '2019-10-25'? limit 1000000, 10) e
????????????on o.id = e.id;
? ? ? ? 通過(guò)使用覆蓋索引查詢(xún)返回需要的主鍵,再根據(jù)這些主鍵關(guān)聯(lián)原表獲得需要的行,這樣可以減少mysql掃描那些需要丟棄的行數(shù)
14. 平均分:
? ??????SELECT id,NAME,AVG(score) FROM stu GROUP BY NAME HAVING AVG(score) < 60? ?//平均分不及格的人
15. mysql主從復(fù)制延遲過(guò)大解決方案:
? ? ? ? 1. MySQL之前是單線(xiàn)程復(fù)制,5.7版本推出多線(xiàn)程復(fù)制
? ? ? ? 2. 分庫(kù)(不同的業(yè)務(wù)使用不同的數(shù)據(jù)庫(kù))
? ? ? ? 3. 硬件升級(jí)
? ??????
? ??????