164.數(shù)據(jù)庫(kù)的三范式是什么困后?
- 第一范式:強(qiáng)調(diào)的是列的原子性澈灼,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng)絮缅。
- 第二范式:要求實(shí)體的屬性完全依賴(lài)于主關(guān)鍵字怎燥。所謂完全依賴(lài)是指不能存在僅依賴(lài)主關(guān)鍵字一部分的屬性负饲。
- 第三范式:任何非主屬性不依賴(lài)于其它非主屬性堤魁。
165.一張自增表里面總共有 7 條數(shù)據(jù),刪除了最后 2 條數(shù)據(jù)返十,重啟 mysql 數(shù)據(jù)庫(kù)妥泉,又插入了一條數(shù)據(jù),此時(shí) id 是幾洞坑?
表類(lèi)型如果是 MyISAM 盲链,那 id 就是 8。
表類(lèi)型如果是 InnoDB迟杂,那 id 就是 6刽沾。
InnoDB 表只會(huì)把自增主鍵的最大 id 記錄在內(nèi)存中,所以重啟之后會(huì)導(dǎo)致最大 id 丟失排拷。
166.如何獲取當(dāng)前數(shù)據(jù)庫(kù)版本侧漓?
使用 select version() 獲取當(dāng)前 MySQL 數(shù)據(jù)庫(kù)版本。
167.說(shuō)一下 ACID 是什么监氢?
- Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作布蔗,或者全部完成藤违,或者全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)纵揍。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤顿乒,會(huì)被恢復(fù)(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣泽谨。即璧榄,事務(wù)不可分割、不可約簡(jiǎn)隔盛。
- Consistency(一致性):在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后犹菱,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。這表示寫(xiě)入的資料必須完全符合所有的預(yù)設(shè)約束吮炕、觸發(fā)器腊脱、級(jí)聯(lián)回滾等。
- Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力龙亲,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致陕凹。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)鳄炉、讀提交(read committed)杜耙、可重復(fù)讀(repeatable read)和串行化(Serializable)。
- Durability(持久性):事務(wù)處理結(jié)束后拂盯,對(duì)數(shù)據(jù)的修改就是永久的佑女,即便系統(tǒng)故障也不會(huì)丟失。
168.char 和 varchar 的區(qū)別是什么谈竿?
- char(n) :固定長(zhǎng)度類(lèi)型,比如訂閱 char(10)嚎花,當(dāng)你輸入"abc"三個(gè)字符的時(shí)候呀洲,它們占的空間還是 10 個(gè)字節(jié)紊选,其他 7 個(gè)是空字節(jié)兵罢。
chat 優(yōu)點(diǎn):效率高卖词;缺點(diǎn):占用空間;適用場(chǎng)景:存儲(chǔ)密碼的 md5 值舶替,固定長(zhǎng)度的,使用 char 非常合適。 - varchar(n) :可變長(zhǎng)度钉跷,存儲(chǔ)的值是每個(gè)值占用的字節(jié)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)的長(zhǎng)度。
所以膝晾,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適臊旭,二者使用需要權(quán)衡。
169.float 和 double 的區(qū)別是什么?
- float 最多可以存儲(chǔ) 8 位的十進(jìn)制數(shù)胧瓜,并在內(nèi)存中占 4 字節(jié)。
- double 最可可以存儲(chǔ) 16 位的十進(jìn)制數(shù)兜粘,并在內(nèi)存中占 8 字節(jié)。
170.mysql 的內(nèi)連接路鹰、左連接诵叁、右連接有什么區(qū)別浓领?
內(nèi)連接關(guān)鍵字:inner join捎拯;左連接:left join;右連接:right join没隘。
內(nèi)連接是把匹配的關(guān)聯(lián)數(shù)據(jù)顯示出來(lái)瑰妄;左連接是左邊的表全部顯示出來(lái),右邊的表顯示出符合條件的數(shù)據(jù)竹宋;右連接正好相反劳澄。
171.mysql 索引是怎么實(shí)現(xiàn)的?
索引是滿(mǎn)足某種特定查找算法的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)會(huì)以某種方式指向數(shù)據(jù)宪潮,從而實(shí)現(xiàn)高效查找數(shù)據(jù)。
具體來(lái)說(shuō) MySQL 中的索引,不同的數(shù)據(jù)引擎實(shí)現(xiàn)有所不同单绑,但目前主流的數(shù)據(jù)庫(kù)引擎的索引都是 B+ 樹(shù)實(shí)現(xiàn)的苔巨,B+ 樹(shù)的搜索效率,可以到達(dá)二分法的性能废离,找到數(shù)據(jù)區(qū)域之后就找到了完整的數(shù)據(jù)結(jié)構(gòu)了侄泽,所有索引的性能也是更好的。
172.怎么驗(yàn)證 mysql 的索引是否滿(mǎn)足需求肖方?
使用 explain 查看 SQL 是如何執(zhí)行查詢(xún)語(yǔ)句的诀豁,從而分析你的索引是否滿(mǎn)足需求。
explain 語(yǔ)法:explain select * from table where type=1窥妇。
173.說(shuō)一下數(shù)據(jù)庫(kù)的事務(wù)隔離舷胜?
MySQL 的事務(wù)隔離是在 MySQL. ini 配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED烹骨、REPEATABLE-READ翻伺、SERIALIZABLE。
- READ-UNCOMMITTED:未提交讀沮焕,最低隔離級(jí)別吨岭、事務(wù)未提交前,就可被其他事務(wù)讀嚷褪鳌(會(huì)出現(xiàn)幻讀辣辫、臟讀、不可重復(fù)讀)魁巩。
- READ-COMMITTED:提交讀急灭,一個(gè)事務(wù)提交后才能被其他事務(wù)讀取到(會(huì)造成幻讀、不可重復(fù)讀)谷遂。
- REPEATABLE-READ:可重復(fù)讀葬馋,默認(rèn)級(jí)別,保證多次讀取同一個(gè)數(shù)據(jù)時(shí)畴嘶,其值都和事務(wù)開(kāi)始時(shí)候的內(nèi)容是一致窗悯,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會(huì)造成幻讀)偷拔。
- SERIALIZABLE:序列化条摸,代價(jià)最高最可靠的隔離級(jí)別,該隔離級(jí)別能防止臟讀切端、不可重復(fù)讀踏枣、幻讀钙蒙。
- 臟讀 :表示一個(gè)事務(wù)能夠讀取另一個(gè)事務(wù)中還未提交的數(shù)據(jù)躬厌。比如,某個(gè)事務(wù)嘗試插入記錄 A屹篓,此時(shí)該事務(wù)還未提交匙奴,然后另一個(gè)事務(wù)嘗試讀取到了記錄 A。
- 不可重復(fù)讀 :是指在一個(gè)事務(wù)內(nèi)泼菌,多次讀同一數(shù)據(jù)哗伯。
- 幻讀 :指同一個(gè)事務(wù)內(nèi)多次查詢(xún)返回的結(jié)果集不一樣。比如同一個(gè)事務(wù) A 第一次查詢(xún)時(shí)候有 n 條記錄笋颤,但是第二次同等條件下查詢(xún)卻有 n+1 條記錄伴澄,這就好像產(chǎn)生了幻覺(jué)阱缓。發(fā)生幻讀的原因也是另外一個(gè)事務(wù)新增或者刪除或者修改了第一個(gè)事務(wù)結(jié)果集里面的數(shù)據(jù)荆针,同一個(gè)記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了喉悴。
174.說(shuō)一下 mysql 常用的引擎箕肃?
InnoDB 引擎:InnoDB 引擎提供了對(duì)數(shù)據(jù)庫(kù) acid 事務(wù)的支持勺像,并且還提供了行級(jí)鎖和外鍵的約束吟宦,它的設(shè)計(jì)的目標(biāo)就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫(kù)系統(tǒng)涩维。MySQL 運(yùn)行的時(shí)候,InnoDB 會(huì)在內(nèi)存中建立緩沖池辰狡,用于緩沖數(shù)據(jù)和索引宛篇。但是該引擎是不支持全文搜索,同時(shí)啟動(dòng)也比較的慢偷卧,它是不會(huì)保存表的行數(shù)的吆倦,所以當(dāng)進(jìn)行 select count(*) from table 指令的時(shí)候,需要進(jìn)行掃描全表蚕泽。由于鎖的粒度小晌梨,寫(xiě)操作是不會(huì)鎖定全表的,所以在并發(fā)度較高的場(chǎng)景下使用會(huì)提升效率的。
MyIASM 引擎:MySQL 的默認(rèn)引擎须妻,但不提供事務(wù)的支持仔蝌,也不支持行級(jí)鎖和外鍵荒吏。因此當(dāng)執(zhí)行插入和更新語(yǔ)句時(shí)敛惊,即執(zhí)行寫(xiě)操作的時(shí)候需要鎖定這個(gè)表,所以會(huì)導(dǎo)致效率會(huì)降低绰更。不過(guò)和 InnoDB 不同的是瞧挤,MyIASM 引擎是保存了表的行數(shù)儡湾,于是當(dāng)進(jìn)行 select count(*) from table 語(yǔ)句時(shí),可以直接的讀取已經(jīng)保存的值而不需要進(jìn)行掃描全表鸵鸥。所以妒穴,如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作時(shí)摊崭,并且不需要事務(wù)的支持的,可以將 MyIASM 作為數(shù)據(jù)庫(kù)引擎的首選矮台。
175.說(shuō)一下 mysql 的行鎖和表鎖?
MyISAM 只支持表鎖瘦赫,InnoDB 支持表鎖和行鎖辰晕,默認(rèn)為行鎖。
- 表級(jí)鎖:開(kāi)銷(xiāo)小确虱,加鎖快含友,不會(huì)出現(xiàn)死鎖。鎖定粒度大校辩,發(fā)生鎖沖突的概率最高窘问,并發(fā)量最低。
- 行級(jí)鎖:開(kāi)銷(xiāo)大宜咒,加鎖慢惠赫,會(huì)出現(xiàn)死鎖。鎖力度小故黑,發(fā)生鎖沖突的概率小儿咱,并發(fā)度最高。
176.說(shuō)一下樂(lè)觀(guān)鎖和悲觀(guān)鎖场晶?
- 樂(lè)觀(guān)鎖:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改混埠,所以不會(huì)上鎖,但是在提交更新的時(shí)候會(huì)判斷一下在此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù)峰搪。
- 悲觀(guān)鎖:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改岔冀,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖凯旭,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)阻止概耻,直到這個(gè)鎖被釋放。
數(shù)據(jù)庫(kù)的樂(lè)觀(guān)鎖需要自己實(shí)現(xiàn)罐呼,在表里面添加一個(gè) version 字段鞠柄,每次修改成功值加 1,這樣每次修改的時(shí)候先對(duì)比一下嫉柴,自己擁有的 version 和數(shù)據(jù)庫(kù)現(xiàn)在的 version 是否一致厌杜,如果不一致就不修改,這樣就實(shí)現(xiàn)了樂(lè)觀(guān)鎖计螺。
177.mysql 問(wèn)題排查都有哪些手段夯尽?
使用 show processlist 命令查看當(dāng)前所有連接信息。
使用 explain 命令查詢(xún) SQL 語(yǔ)句執(zhí)行計(jì)劃登馒。
開(kāi)啟慢查詢(xún)?nèi)罩境孜眨榭绰樵?xún)的 SQL。
178.如何做 mysql 的性能優(yōu)化陈轿?
為搜索字段創(chuàng)建索引圈纺。
避免使用 select *秦忿,列出需要查詢(xún)的字段。
垂直分割分表蛾娶。
選擇正確的存儲(chǔ)引擎灯谣。