一、如何設(shè)計一個關(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)鍵字段。


修改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)行修改