數(shù)據(jù)庫面試核心

一、如何設(shè)計一個關(guān)系型數(shù)據(jù)庫

關(guān)系型數(shù)據(jù)庫

二、索引相關(guān)

1.為什么要使用索引

快速查詢數(shù)據(jù)

2.什么樣的信息能成為索引

主鍵、唯一鍵及普通鍵等

3.索引的數(shù)據(jù)結(jié)構(gòu)

1、生成索引,建立二叉查找樹進(jìn)行二分查找

2、生成索引,建立B-Tree結(jié)構(gòu)進(jìn)行查找

3、生成索引,建立B+-Tree結(jié)構(gòu)進(jìn)行查找(mysql常用結(jié)構(gòu))

生成索引,建立Hash結(jié)構(gòu)進(jìn)行查找

4.二叉查找樹

二叉查找樹

優(yōu)點(diǎn):使用二分查找法,效率比全表查詢快
缺點(diǎn):當(dāng)層次越多,發(fā)生IO的次數(shù)也會越多

5.平衡二叉樹

    3
   / \
  9  20
    /  \
   15   7
返回 true 。是平衡的
      1
      / \
     2   2
    / \
   3   3
  / \
 4   4
返回 false 。不是平衡的

6.B-Tree

1、根節(jié)點(diǎn)至少包括兩個孩子

2、樹中每個節(jié)點(diǎn)最多含有m個孩子(m>=2)

3、除根節(jié)點(diǎn)和葉節(jié)點(diǎn)外,其他每個節(jié)點(diǎn)至少有ceil(m/2)個孩子

4、所有葉子節(jié)點(diǎn)都位于同一層

5、左關(guān)鍵字永遠(yuǎn)比左節(jié)點(diǎn)下所有子節(jié)點(diǎn)關(guān)鍵字大

6、右關(guān)鍵字永遠(yuǎn)比右節(jié)點(diǎn)下所有子節(jié)點(diǎn)關(guān)鍵字小

7、其他節(jié)點(diǎn)的關(guān)鍵字,在父節(jié)點(diǎn)左右關(guān)鍵字之間
優(yōu)點(diǎn):每個節(jié)點(diǎn)盡可能的多節(jié)點(diǎn),減少樹的高度,減少IO樹

7.B+-Tree

1、非葉子節(jié)點(diǎn)的子樹指針與關(guān)鍵字個數(shù)相同

2、非葉子節(jié)點(diǎn)的子樹指針,指向關(guān)鍵字值的子樹

3、非葉子節(jié)點(diǎn)僅用來索引,數(shù)據(jù)都保存在葉子節(jié)點(diǎn)中

4、所有葉子節(jié)點(diǎn)均有一個鏈指針指向下一個葉子節(jié)點(diǎn)
優(yōu)點(diǎn):
1、B+樹的磁盤讀寫代價更低
2、B+樹的查詢效率更加穩(wěn)定
3、B+樹更有利于對數(shù)據(jù)庫的掃描

8.Hash索引

優(yōu)點(diǎn):查詢效率更高
缺點(diǎn):
1、僅僅能滿足"=","IN",不能使用范圍查詢
2、無法被用來避免數(shù)據(jù)的排序操作
3、不能利用部分索引鍵查詢
4、不能避免表掃描
5、遇到大量Hash值相等的情況后性能并不一定就會比B-Tree索引高

9.密集索引和稀疏索引的區(qū)別

1、密集索引文件中的每個搜索碼值都對應(yīng)一個索引值

2、稀疏索引文件只為索引碼的某些值建立索引項

10.InnDB(mysql)

1、若一個主鍵被定義,該主鍵則作為密集索引

2、若沒有主鍵被定義,該表的第一個唯一非空索引則作為密集索引

4、若不滿足以上,innodb內(nèi)部會生成一個隱藏主鍵(密集索引)

5、非主鍵索引存儲相關(guān)鍵位和其對應(yīng)的主鍵值,包含兩次查找

6、一個表只能有一個密集索引

11.索引額外問題之如何調(diào)優(yōu)Sql

如何定位并優(yōu)化慢查詢Sql

根據(jù)慢日志定位慢查詢sql
1、在navicat中輸入show variables like '%quer%' 展示慢日志的配置項,slow_query_log是否開啟慢日志記錄,slow_query_log_file慢日志記錄的位置,long_query_time sql執(zhí)行多少秒為慢sql。
2、在navicat中輸入show status like '%slow_quer%',得到慢sql的總數(shù)。
3、在navicat中輸入set global slow_query_log = on開啟慢日志記錄,set global long_query_time = 1設(shè)置sql超過1秒為慢sql。

使用explain等工具分析sql
1、在sql前加explain,就能分析sql為什么慢,explain分析中的關(guān)鍵字段。


type的優(yōu)先級,前面的更快

extra的解析

修改sql或者盡量讓sql走索引

聯(lián)合索引的最左匹配原則的成因

1、最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 3 and b = 4 and c > 5 and d = 6,如果建立(a、b、c、d) 順序的索引,d是用不到索引的,例如a = 1 and b = 2 a,b字段都可以使用索引,因?yàn)樵赼值確定的情況下b是相對有序的,而a>1and b=2,a字段可以匹配上索引,但b值不可以,因?yàn)閍的值是一個范圍,在這個范圍中b是無序的。
2、=和in可以亂序,比如a=1 and b=2 and c=3建立(a、b、c)索引可以任意順序,mysql的查詢優(yōu)化器會幫你優(yōu)化索引可以識別的形式。
3、創(chuàng)建聯(lián)合索引時列的選擇原則經(jīng)常用的:
列優(yōu)先(最左匹配原則)
離散度高的列優(yōu)先(離散度高原則)
寬度小的列優(yōu)先(最少空間原則)
列的離散性計算:count(distinct col)/ count(col)
例如:
id列一共9列都不重復(fù) 9/9 = 1
性別列一共9列只有(男或者女)兩列 2/9 約等于0.2
離散性越高選擇性越大(也就是不重復(fù)率高)

索引是建立得越多越好嗎

1、數(shù)據(jù)量小的表不需要建立索引,建立會增加額外的索引開銷
2、數(shù)據(jù)變更需要維護(hù)索引,因此更多的索引意味著更多的維護(hù)成本
3、更多的索引意味著也需要更多的空間

三、鎖相關(guān)

1.MyISAM與InnoDB關(guān)于鎖方面的區(qū)別的是什么?

1、MyISAM默認(rèn)用的表級鎖,不支持行級鎖
2、InnoDB默認(rèn)用的是行級鎖,也支持表級鎖

讀鎖也稱為共享鎖,多個查詢sql可同時查,寫鎖也稱為排他鎖,先上了寫鎖其他操作都要等待。

MyISAM適合的場景

1、頻繁執(zhí)行全表count語句
2、對數(shù)據(jù)進(jìn)行增刪改的頻率不高,查詢非常頻繁
3、沒有事務(wù)

InnoDB適合的場景

1、數(shù)據(jù)增刪改查都相當(dāng)頻繁
2、可靠性要求比較高,要求支持事務(wù)

數(shù)據(jù)庫鎖的分類

1、按鎖的粒度劃分,可分為表級鎖,行級鎖,頁級鎖
2、按鎖級別劃分,可分為共享鎖、排他鎖
3、按加鎖方式劃分,可分為自動鎖、顯示鎖
4、按操作劃分,可分為DML鎖,DDL鎖
5、按使用方式劃分,可分為樂觀鎖,悲觀鎖

2.數(shù)據(jù)庫事務(wù)的四大特性

ACID
1、原子性(Atomic)事務(wù)中的所有操作,要么一起成功,要么一起失敗
2、一致性(Consistency)如果約定了a+b=10,無論a或b如何加減,結(jié)果永遠(yuǎn)都是a+b=10
3、隔離性(Isolation)一個事務(wù)的操作,不會影響另外一個事務(wù)的操作
4、持久性(Durability)事務(wù)一旦提交,要保證正確存儲到相應(yīng)設(shè)備

3.事務(wù)隔離級別以及各級別下的并發(fā)訪問問題

事務(wù)并發(fā)訪問引起的問題以及如何避免

1、更新丟失——mysql所有事務(wù)隔離在數(shù)據(jù)庫層面均可避免
2、臟讀——READ-COMMITTED事務(wù)隔離級別以上可避免(orcale數(shù)據(jù)庫默認(rèn)隔離級別)
3、不可重復(fù)讀——REPEATABLE-READ事務(wù)隔離級別以上可避免(mysql數(shù)據(jù)庫默認(rèn)隔離級別,通過gap鎖能保證幻讀不出現(xiàn),gap鎖就是鎖對有可能出現(xiàn)幻讀的范圍加鎖,這個范圍跟where條件有關(guān))
4、幻讀——SERIALIZABLE事務(wù)隔離級別可避免

InnoDB可重復(fù)讀隔離級別下如何避免幻讀

1、行鎖
2、Gap鎖(間隙鎖)
如果where條件全部命中(條件必須是主鍵或唯一索引),則不會用Gap鎖,只會加行級鎖。
如果where條件部分命中或全部不命中,則會加Gap鎖
Gap鎖會用在非唯一索引或者不走索引的當(dāng)前讀中
非唯一索引,innodb中會通過db_row_id唯一標(biāo)識一行數(shù)據(jù),通過row_id來確定gap鎖的鎖定范圍
不走索引或全部都不命中,會鎖表,這種效率最低應(yīng)盡量避免

當(dāng)前讀和快照讀

1、當(dāng)前讀:select ... lock in share mode,select .... for update
2、當(dāng)前讀:update insert delete
3、快照讀:不加鎖的非阻塞讀,不加鎖的select(SERIALIZABLE隔離級別以下)
當(dāng)前讀就是拿到最新的數(shù)據(jù),而且加鎖避免其他事務(wù)對數(shù)據(jù)進(jìn)行修改

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

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

  • 數(shù)據(jù)庫的基本是概念名詞解釋: 數(shù)據(jù)庫名詞解釋 元組:可以理解為表的每一行就是一個元組 候選碼:若關(guān)系中的某一屬性組...
    杰倫哎呦哎呦閱讀 1,238評論 0 6
  • 前言 說到數(shù)據(jù)庫這個詞,我只能用愛恨交加這個詞來形容它。兩年前在自己還單純懵懂的時候進(jìn)了數(shù)據(jù)庫的課堂,聽完數(shù)據(jù)庫的...
    ObjectSpace閱讀 427評論 0 1
  • 索引 數(shù)據(jù)庫中的查詢操作非常普遍,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 3,221評論 0 8
  • 面試題引發(fā)的思考: Q: ARC都幫我們做了什么? ARC是 LLVM編譯器 和 Runtime系統(tǒng) 相互協(xié)作的一...
    hazydream閱讀 302評論 0 0
  • pomelo中組件是可重用的服務(wù)單位,一個組件實(shí)例提供若干種服務(wù),比如說處理機(jī)組件載入后處理機(jī)代碼后將會把客戶端消...
    JunChow520閱讀 912評論 0 1

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