從需求出發(fā)來看關(guān)系模型與非關(guān)系模型--關(guān)系模型與非關(guān)系模型概述
1.層次模型
2.關(guān)系模型
3.ORMapping的作用:將對象模型轉(zhuǎn)換為關(guān)系模型
從需求出發(fā)來看關(guān)系模型與非關(guān)系模型--時代的變革
從需求出發(fā)來看關(guān)系模型與非關(guān)系模型--時代的變革1
互聯(lián)網(wǎng)在線處理的需求排序列表基本上可以認(rèn)為是: 數(shù)據(jù)的擴(kuò)展性>請求的響應(yīng)時間盡可能短>down機(jī)時間盡可能短>成本盡可能低>可自動快速恢復(fù)>數(shù)據(jù)的讀取一致性>程序開發(fā)者的方便與快速響應(yīng)需求敲霍。
數(shù)據(jù)庫核心組件
映射(map)
存儲數(shù)據(jù)并提供查詢的結(jié)構(gòu)
預(yù)寫式日志(write-ahead logging,WAL)
記錄每一次寫操作
觸發(fā)器(trigger)
鎖(lock)
保證一個邏輯原子操作的完整性
排它鎖(寫鎖)和共享鎖(讀鎖)
執(zhí)行優(yōu)化器
輸入 為 sql 的抽象語法樹(ast)域携,輸出為執(zhí)行計(jì)劃
sql 解析器
將 sql 轉(zhuǎn)化為抽象語法樹
存儲過程
核心目標(biāo): 讓數(shù)據(jù)庫端能夠運(yùn)行邏輯代碼
優(yōu)勢:性能好姨蝴,因?yàn)橹苯优c內(nèi)存交互部蛇,沒有網(wǎng)絡(luò)通信 延遲小 吞吐量大
可以用來封裝一些需要該性能的小的邏輯單元
劣勢:需要綁定到特定的數(shù)據(jù)庫剂陡,大部分存儲過程是面向過程的代碼,運(yùn)維難度比較大狐胎,不適合復(fù)雜業(yè)務(wù)邏輯
視圖
空間換時間鸭栖,利用不確定性變成確定性的方式,實(shí)現(xiàn) join 查詢速度的優(yōu)化和聚焦
從外部查詢看數(shù)據(jù)庫的內(nèi)部實(shí)現(xiàn)機(jī)制
李雷和韓梅梅的一次轉(zhuǎn)賬事務(wù)--事務(wù)系統(tǒng)概述
事務(wù)的 ACID
原子性 一致性 隔離性 持久性
隔離性的四個隔離級別 其實(shí)是對一致性和性能之間的一種取舍
數(shù)據(jù)的存儲介質(zhì)-磁盤的硬件特性
數(shù)據(jù)的存儲介質(zhì)-磁盤的RAID
數(shù)據(jù)的存儲介質(zhì)-固態(tài)存儲SSD
數(shù)據(jù)映射--映射概述
數(shù)據(jù)映射--有序數(shù)組
數(shù)據(jù)映射--平衡二叉有序樹
二叉樹特性:
- 有一個 ROOT(根)節(jié)點(diǎn) (數(shù)據(jù)訪問起點(diǎn))
- 一個節(jié)點(diǎn)有兩個子節(jié)點(diǎn)
- 父節(jié)點(diǎn)都有一個到子節(jié)點(diǎn)的引用(指針)
二叉排序樹: - 左子節(jié)點(diǎn)上的數(shù)據(jù)一定比父節(jié)點(diǎn)的數(shù)據(jù)小握巢,右子節(jié)點(diǎn)的數(shù)據(jù)一定比父節(jié)點(diǎn)的數(shù)據(jù)大
平衡二叉樹:
一個空樹或它的左右兩個子樹的高度差的絕對值不超過1晕鹊,并且左右兩個子樹都是一棵平衡二叉樹。
平衡二叉排序樹:
滿足以上條件
中序遍歷平衡二叉樹其實(shí)就是對數(shù)據(jù)的有序遍歷
左根右的順序
讓樹能夠保持有序的前提下盡可能平衡的主要方式
AVL,Tree Heap,紅黑樹
分層 高層數(shù)據(jù)少
最底層 level0 保存所有數(shù)據(jù)
寫入時從最底層寫入
讀取時從最高層開始讀
寫入時通過計(jì)算概率決定是否向上層推
問題:為什么 B 樹用數(shù)組結(jié)構(gòu)實(shí)現(xiàn)而不是鏈表
答:數(shù)組結(jié)構(gòu)(有序)能夠進(jìn)行二分查找
映射的存儲模型 – 面向列的存儲和行存儲
映射的存儲模型 – 列存儲
SQL解析與優(yōu)化器 – 概述
SQL解析與優(yōu)化器 - 基于行存儲的單表查詢
SQL解析與優(yōu)化器 - 基于列存儲的單表查詢
SQL解析與優(yōu)化器 - 倒排索引(上)
分詞 相關(guān)性
inner join 镜粤,最強(qiáng)約束匹配捏题,只有全部符合的數(shù)據(jù)才會留下玻褪。
Left join ,保留左表內(nèi)所有數(shù)據(jù)肉渴,右表無對應(yīng)的用NULL代替。
right join 保留右表內(nèi)所有數(shù)據(jù)带射,左表無對應(yīng)的用NULL代替同规。
Full join 保留左右表內(nèi)所有數(shù)據(jù),對應(yīng)表內(nèi)無對應(yīng)的用NULL代替窟社。
Cross join 將左表內(nèi)的每一行數(shù)據(jù)與右表內(nèi)的每一行數(shù)據(jù)進(jìn)行關(guān)聯(lián)后輸出券勺。笛卡爾積
join 算法
Nested loop
hash join
sort merge join
Nested loop 和hash join ,都能夠比較輕松的處理小表和大表的取交集場景灿里,其中nested loop要求大表有索引关炼,如果小表可以完全的被放到內(nèi)存中,那么hash join是一個比較好的處理大小表join的方式匣吊。
Sort merge join 則要求兩張表都需要按照匹配條件排序儒拂,這個的構(gòu)建成本略高,但它的優(yōu)勢是色鸳,排序過程對內(nèi)存要求較低社痛,并且可以充分的并行執(zhí)行,因此可以發(fā)現(xiàn)命雀,它經(jīng)常出現(xiàn)在列存蒜哀,倒排索引等各類條件變化頻繁,數(shù)據(jù)量非常大的場景中吏砂。
海量數(shù)據(jù)-Group by Order by having
這類操作的核心就是幫助用戶進(jìn)行數(shù)據(jù)統(tǒng)計(jì)和分析撵儿。
對于group by ,一般的算法就是把數(shù)據(jù)按照by 后面的條件放到一個HashMap里,然后按照aggregation function(count,sum,max,min)進(jìn)行一下聚合統(tǒng)計(jì)狐血,然后走h(yuǎn)aving進(jìn)行結(jié)果集過濾就好
而對于order by 淀歇,如果order by的條件恰好在索引上,那么可以認(rèn)為數(shù)據(jù)本身就是有序的氛雪,因此不需要其他處理房匆,直接使用索引進(jìn)行處理即可。
當(dāng)然,如果沒有索引浴鸿,那么就需要創(chuàng)建一個臨時表井氢,然后在臨時表內(nèi)對數(shù)據(jù)進(jìn)行排序
海量數(shù)據(jù)-事務(wù)原子性
海量數(shù)據(jù)-事務(wù)一致性1
海量數(shù)據(jù)-事務(wù)一致性2
海量存儲之十六--一致性和高可用專題
2pc 腦裂
3pc
paxos zab