做名片贊?rùn)C(jī)器人電腦網(wǎng)站是多少整站快速排名
數(shù)據(jù)庫(kù)常見(jiàn)問(wèn)題(持續(xù)更新)
1、數(shù)據(jù)庫(kù)范式?
- 1NF:不可分割
- 2NF:沒(méi)有非主屬性對(duì)候選碼存在部分依賴
- 3NF:沒(méi)有非主屬性傳遞依賴候選碼
- BCNF:消除了主屬性對(duì)對(duì)候選碼的傳遞依賴或部分依賴
2、InnoDB事務(wù)的實(shí)現(xiàn)?
InnoDB 為Mysql數(shù)據(jù)庫(kù)的默認(rèn)引擎,InnoDB通過(guò)buffer pool,log buffer, redo log, undo log來(lái)實(shí)現(xiàn)事務(wù)
以一個(gè)update語(yǔ)句為例:
- InnoDB在收到一個(gè)update語(yǔ)句后,會(huì)先根據(jù)條件找到數(shù)據(jù)所在頁(yè),并將該頁(yè)緩存在Buffer Pool中;
- 執(zhí)行update語(yǔ)句,修改Buffer Pool中的數(shù)據(jù),也就是內(nèi)存中的數(shù)據(jù);
- 針對(duì)update語(yǔ)句生成一個(gè)redo log對(duì)象,并存入log buffer中;
- 針對(duì)update語(yǔ)句生成undo log日志,用于實(shí)現(xiàn)事務(wù)回滾;
- 如果事務(wù)提交,那么會(huì)把redo log對(duì)象進(jìn)行持久化,會(huì)后將buffer pool中所修改的數(shù)據(jù)頁(yè)持久化到磁盤(pán)中;
- 如果事務(wù)回滾,利用undo log進(jìn)行回滾;
3、分頁(yè)操作如何實(shí)現(xiàn)?
MySQL中使用limit關(guān)鍵字,舉例:
select * from table_name where 條件 limit 當(dāng)前頁(yè)碼*頁(yè)面容量-1,頁(yè)面容量
limit 初始位置,記錄數(shù)
where 字段名 like 表達(dá)式
- %:0或多個(gè)任意字符
- _:任意單個(gè)字符
- []:其中的任意一個(gè)值
4、B樹(shù)和B+樹(shù)?
B樹(shù)的特點(diǎn):
- 節(jié)點(diǎn)排序
- 一個(gè)節(jié)點(diǎn)可以存多個(gè)元素,這多個(gè)元素也是排好序的
B+樹(shù)的特點(diǎn):
- 擁有B樹(shù)的所有特點(diǎn)
- 葉子之間存在指針
- 非葉子節(jié)點(diǎn)上的元素在葉子節(jié)點(diǎn)上冗余,且葉子節(jié)點(diǎn)排好序的
問(wèn)題:InnoDB存儲(chǔ)引擎采用B+樹(shù)為索引的原因?
- 相比于紅黑樹(shù)來(lái)說(shuō),B+樹(shù)層級(jí)更少,搜索效率更高。
- 相比于B樹(shù)來(lái)說(shuō),B樹(shù)無(wú)論是葉子結(jié)點(diǎn)還是非葉子結(jié)點(diǎn)都會(huì)保存數(shù)據(jù),這樣會(huì)導(dǎo)致一頁(yè)存儲(chǔ)的鍵值減少,存儲(chǔ)大量數(shù)據(jù)時(shí)只能增加樹(shù)的高度,導(dǎo)致性能降低。