摘要:持久性一旦事務(wù)提交成功,產(chǎn)生的數(shù)據(jù)變更將永久保存在數(shù)據(jù)庫中。不可重復(fù)讀執(zhí)行兩次相同的查詢,可能得到不同的結(jié)果??纱谢瘒?yán)格的串行阻塞,并發(fā)能力不好。數(shù)據(jù)時記錄刪除時間為當(dāng)前事務(wù)版本號。非聚簇索引樹的葉子節(jié)點存放實際數(shù)據(jù)的地址。
前言
作為后端猿的我們,不出意外每天都會和mysql打交道。除了每天寫不膩的CURD語句,關(guān)于mysql我們應(yīng)該要了解它的那些基礎(chǔ)知識呢?
直入主題 簡單畫出mysql的邏輯架構(gòu)圖?接 入 層 ----------------------- ? ? ? ? 緩 存 解 析 器 ? ? 優(yōu) 化 器 ----------------------- 引 擎mysql常見的引擎有哪些,區(qū)別是什么?
InnoDB
支持事務(wù)
行鎖
聚簇索引
輔助索引(二級索引)索引存放的是主鍵
MyISAM
不支持事務(wù)
表鎖
崩潰無法安全恢復(fù)
非聚簇索引
輔助索引(二級索引)索引存放的還是實際數(shù)據(jù)的地址
Memory
基于內(nèi)存
表鎖
字段長度固定,不支持blob,text, 即使指定vachar實際儲存也會轉(zhuǎn)為char
Archive
只支持insert/select操作
適合日志等
...
什么是事務(wù)的ACDI概念?A: Atomicity, 原子性, 一個事務(wù)的所有操作視為一個整體,要不全部成功,要不全部失敗。
C: Consistency, 一致性, 一個事務(wù)下的所有的數(shù)據(jù)狀態(tài)變更,只有事務(wù)提交成功才全部變更。
D: Durability, 持久性, 一旦事務(wù)提交成功,產(chǎn)生的數(shù)據(jù)變更將永久保存在數(shù)據(jù)庫中。
I: Isolation, 隔離性, 一個事務(wù)在提交之前對其他事務(wù)不可見。
什么是臟讀,幻讀,不可重復(fù)讀?臟讀:讀取未提交事務(wù)的數(shù)據(jù),數(shù)據(jù)可能被回滾,不符合隔離性的定義。
幻讀:一個事務(wù)批量讀取了一批數(shù)據(jù)時,另一個事務(wù)提交了新的數(shù)據(jù),當(dāng)之前的事務(wù)再次讀取時,會產(chǎn)生幻影行。
不可重復(fù)讀:執(zhí)行兩次相同的查詢,可能得到不同的結(jié)果。
mysql事務(wù)的隔離級別有哪些?默認(rèn)的隔離級別是什么?未提交讀:一個事務(wù)還未提交,另一個事務(wù)就可以讀取,這樣導(dǎo)致的后果,臟讀。
提交讀(又叫,不可重復(fù)讀):一個事務(wù)未提交對其他事務(wù)不可見,但是會產(chǎn)生幻讀和不可重復(fù)讀。
可重復(fù)讀(mysql默認(rèn)隔離級別):保證同一個事務(wù)下多次讀取的結(jié)果一致,但是會產(chǎn)生幻讀。
可串行化:嚴(yán)格的串行阻塞,并發(fā)能力不好。
隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
MVCC:Multi Version Concurrency Control, 多版本并發(fā)控制,mysql防止幻讀的一種技術(shù)手段。每行數(shù)據(jù)存在間隙行,間隙行存放該行數(shù)據(jù)的創(chuàng)建時間,刪除時間,這里的時間實際是事務(wù)的版本號。當(dāng),
select數(shù)據(jù)時:只查詢創(chuàng)建時間小于等于當(dāng)前事務(wù)版本號 -> 當(dāng)前事務(wù)或當(dāng)前事務(wù)之前插入的行,刪除時間大于當(dāng)前版本號的行 -> 當(dāng)前事務(wù)版本前未被刪除的行。
update數(shù)據(jù)時:在原有行a的基礎(chǔ)上復(fù)制行a",行a的刪除時間設(shè)置為當(dāng)前的事務(wù)版本號,行a"的創(chuàng)建時間設(shè)置為當(dāng)前的事務(wù)版本號。
insert數(shù)據(jù)時:記錄創(chuàng)建時間為當(dāng)前事務(wù)版本號。
delete數(shù)據(jù)時:記錄刪除時間為當(dāng)前事務(wù)版本號。
死鎖是怎么出現(xiàn)的,并寫出簡單示例?死鎖產(chǎn)生的原因是兩個事務(wù)互相等待對方釋放,產(chǎn)生了循環(huán)依賴,mysql采用了死鎖檢測(檢測到循環(huán)依賴返回錯誤)和死鎖超時(超時回滾持有行鎖最少的事務(wù))的方式盡可能去避免死鎖。例如:
行鎖: UPDATE `table_demo` SET `a` = "test" WHERE `b` = "lalala"; UPDATE `table_demo` SET `b` = "test" WHERE `a` = "lalala"; UPDATE `table_demo` SET `b` = "test" WHERE `a` = "lalala"; UPDATE `table_demo` SET `a` = "test" WHERE `b` = "lalala";什么是聚簇索引和非聚簇索引?
聚簇索引:InnoDB, B+樹的葉子節(jié)點存放實際數(shù)據(jù)。
非聚簇索引:MyISAM, B+樹的葉子節(jié)點存放實際數(shù)據(jù)的地址。
什么是覆蓋索引?覆蓋索引:要查詢的行被索引覆蓋,從索引中可以直接讀取,不需要回表查詢。例如:
CREATE TABLE `demo_table`( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT "自增ID", `username` char(32) NOT NULL DEFAULT "" COMMENT "用戶名", `password` char(32) NOT NULL DEFAULT "" COMMENT "密碼", PRIMARY KEY (`id`), KEY `idx_username` (`username`) )ENGINE=InnoDB DEFAULT CHARSET=UTF8;
explain select `username` from `demo_table` where `username` = "demo"; +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+ | 1 | SIMPLE | demo_table | ref | idx_username | idx_username | 96 | const | 1 | Using where; Using index | +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+
Extra里的Using index就是使用了覆蓋索引的意思。
什么是索引的最左前綴匹配原則?個人目前理解:例如使用聯(lián)合索引,從左向右依次匹配,未匹配到索引字段或第一個范圍查找(between、like、大于、小于)為止,及該部分索引有效。
InnoDB為什么不采用紅黑樹而采用B+樹作為索引存放數(shù)據(jù)結(jié)構(gòu),并簡要畫出B+樹?(目前我個人的理解比較淺歡迎積極糾正~)紅黑樹本質(zhì)是二叉樹,每個節(jié)點最多擁有兩個子節(jié)點,所以紅黑樹的深度較深。
B樹每個節(jié)點最多可以有n個子節(jié)點,根節(jié)點常駐內(nèi)存且每個節(jié)點剛好申請1個頁的大小,假如每個節(jié)點擁有100個子節(jié)點,那百萬級的數(shù)據(jù)我們基本上只需要深度是3就可以存下 => 100^3,這樣就減少的io次數(shù)(一個節(jié)點的大小通常為磁盤一個頁的大小)。
又有“局部性原理”(一旦一個數(shù)據(jù)被查詢,那么它附近的數(shù)據(jù)可能也會需要被查詢),其次B+樹的葉子節(jié)點構(gòu)成一個鏈表,這樣我們就可以很容易的查詢出一段范圍的數(shù)據(jù),其次B+樹的根節(jié)點和內(nèi)部節(jié)點只存放該索引下一個子節(jié)點的位置的指針,數(shù)據(jù)只存放在葉子節(jié)點里,這樣非葉子節(jié)點就可以有更多的空間存放索引的位置,索引的范圍就可以盡可能的大,從而樹的深度就可能的小。
結(jié)語后續(xù)持續(xù)修正和補(bǔ)充,如果有什么寫的不對的地方歡迎大家積極指正,謝謝大家。
掃面下方二維碼關(guān)注我的技術(shù)公眾號,及時為大家推送我的原創(chuàng)技術(shù)分享
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28208.html
摘要:歡迎你們跟著閏土大叔走進(jìn)時代。其中購買數(shù)量可以增加或減少,每類商品還可以從購物車中移除。后記這大概就是一次用重構(gòu)電商項目中的購物車模塊的所有實現(xiàn)過程。作者閏土大叔鏈接來源掘金著作權(quán)歸作者所有。 前言 從這篇文章開始,我準(zhǔn)備給大家分享一些關(guān)于Vue.js這門框架的技巧性系列文章,正好我們公司項目中也用到了Vue。所以,教是最好的學(xué)。進(jìn)階篇比較適合于二三線城市,還在小廠打拼的童鞋們。歡迎你...
摘要:月日日,靈雀云企業(yè)定制培訓(xùn)在深圳招商銀行總部圓滿結(jié)束。靈雀云培訓(xùn)中強(qiáng)調(diào)理論實踐工具落地相結(jié)合。靈雀云是官方認(rèn)證培訓(xùn)合作伙伴服務(wù)提供商。不久之后,靈雀云還將推出微服務(wù)的培訓(xùn)課程。 showImg(https://segmentfault.com/img/bVblpFV?w=600&h=334); 12月13日-14日,靈雀云企業(yè)定制k8s培訓(xùn)在深圳招商銀行總部圓滿結(jié)束。 來自招行總部信息...
摘要:最近華為云開始發(fā)力,在全國范圍內(nèi)開展伙伴走進(jìn)華為云活動,展示了其在公有云方面的決心。年華為殺入公有云,有的看好有的唱衰,但是無疑為中國公有云市場增加了變數(shù)。年月華為正式宣布進(jìn)入公有云市場,成立華為云。2017年9月舉辦的全聯(lián)接大會(HUAWEI CONNECT 2017)上,華為副董事長、輪值CEO郭平表示,華為已經(jīng)戰(zhàn)略投入了公有云,并承諾長期投入,華為有決心也有能力和合作伙伴打造世界上的5...
閱讀 2214·2021-10-18 13:28
閱讀 2532·2021-10-11 10:59
閱讀 2357·2019-08-29 15:06
閱讀 1143·2019-08-26 13:54
閱讀 821·2019-08-26 13:52
閱讀 3158·2019-08-26 12:02
閱讀 3010·2019-08-26 11:44
閱讀 2522·2019-08-26 10:56