1.mysql部分
問題問題1:mysql的儲存引擎
問題2:mysql的索引機制
問題3:mysql的事務以及事務隔離級別
問題4:mvcc/gap lock是做什麼的
問題5:mysql的悲觀鎖與樂觀鎖
回答問題1:mysql的儲存引擎
mysql的儲存引擎在mysql中的查詢語句為:mysql> show engines,
檢視當前mysql的預設儲存引擎為:mysql> show variables like '%storage_engine%',
檢視某個錶用了什麼引擎則是:mysql> show create table 表名;
mysql的常用儲存引擎myisam:不支援事務,不支援外來鍵,訪問速度快,對事務完整性沒有要求,設計之初主要為了查詢操作。使用場景有:非事務型應用,唯讀類應用,空間類應用
innodb(mysql 5.5後預設引擎):支援完整事務,支援外來鍵約束,行級鎖,設計之初處理大容量資料庫操作,容易有io瓶頸。使用場景:適用絕大多數場景
memory:只儲存表,資料放在記憶體中,掉電後資料不保留,訪問速度快。使用場景:內容變化不頻繁的**表,或者是作為統計
問題2:mysql的索引機制
mysql的索引機制有如下幾種聚集索引:就是按照每張表的主鍵構造一顆b+樹,葉子節點村完整的行記錄資料,未定義主鍵,則取第乙個唯一索引,每張表只能擁有乙個聚集索引。在多數情況下,查詢優化器傾向於採用聚集索引。因為聚集索引能夠在b+樹索引的葉子節點上直接找到資料,並且可以快速查詢資料。
非聚集索引:是對聚集索引的一種補充,每張表可以有多個輔助索引,輔助索引與聚集索引區別為葉子節點不包含行記錄的全部資料,除此之外還包含乙個書籤,可以指向對應的行資料。
普通索引:普通的索引,index只是為了加速查詢
唯一索引:主鍵索引:加速查詢+約束(不為空,不能重複) 唯一索引:加速查詢+約束(不能重複)
組合索引:多個索引聯合查詢,查詢順序從左到右查詢。
備註:舉例說明索引機制的使用場景(**的會員卡系統,會員編號作為主鍵,會員編號就是唯一索引,用來建立b+樹;會員姓名如果要建立索引,則就是普通索引;會員身份證資訊如果要建立索引,則就是唯一索引)
補充知識:b+樹與b樹
(1.)b樹
所謂的b樹就是多路搜尋樹,任意乙個非葉子節點最多有m個兒子,關鍵字分布在整顆樹中,任何乙個關鍵字出現且只出現乙個節點中,搜尋有可能在非葉子節點中結束,效能等價於二分查詢,時間複雜度為o(lgn)
如:(m=3)
(2.)b+樹
所謂的b+樹,就是b樹的變體,也是多路搜尋樹,非葉子節點的字數指標與關鍵字個數相同,非葉子節點子樹指標指向子樹,所有的葉子節點都增加乙個鏈指標,所有的關鍵字都在葉子節點**現,不可能在非葉子結點命中,非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層,比較適合檔案索引系統
如:(m=3)
問題3:mysql的事務以及事務隔離級別
mysql的事務遵循4個條件(acid),有原子性:不可分割性;一致性;隔離性;永續性;在實際使用中,使用事務保證乙個事務中的操作,要麼全部完成,要麼全部不完成,保證資料的安全性
其中事務隔離級別分為以下幾種ru:既未提交讀,容易出現髒讀情況,既事務a讀到了事務b沒有提交的資料;
rc:既提交讀,為解決髒讀問題,容易出現提交重複的情況,既事務a在執行的過程中,有可能事務b提交了資料,事務讀取的資料和之前不一致;
rr:既可重複讀,為解決上一級的資料不一致問題,該級別採用mvcc(多版本併發操作)解決重複讀,一般rr級別會產生幻讀的問題,既同乙個事務多次執行同乙個select,讀取到的資料行發生了改變,這是因為資料行發生了行數減少或者新增;所謂幻讀就是同乙個事務裡,查詢的結果都是事務開始時的狀態(一致性)。但是,如果另乙個事務同時提交了新資料,本事務再更新時,就會「驚奇的」發現了這些新資料,貌似之前讀到的資料是「鬼影」一樣的幻覺。搞笑的比喻就是,假如,中午去食堂打飯吃,看到乙個座位是空的,便屁顛屁顛的去打飯,回來後,發現這些座位都還是空的(重複讀),竊喜。走到跟前剛準備坐下時,卻驚現乙個恐龍妹,嚴重影響食慾。彷彿之前看到的空座位是「幻影」一樣。但是mysql中rr級別引入了gap lock(間隙鎖)的概念,可在rr級別即可解決幻讀的問題;另外乙個特性是mysql裡的mvcc只解決讀-寫的阻塞問題,寫-寫依然還是阻塞的。
se:既可序列化,事務相當於序列操作,解決了髒讀、不可重複讀、幻讀等問題,但對效能和效率的影響很大
問題4:mvcc/gap lock是做什麼的
mvcc:既多版本併發操作,基本原理就是某個時間點的快照,每行資料都存在乙個版本,每次資料更新時都更新該版本,修改是copy出當前版本隨意修改,各個事務之間無干擾,儲存時則比較版本號,如果成功,則覆蓋原紀錄,失敗則放棄並回滾。需要注意的是mysql裡的mvcc只解決讀-寫的阻塞問題,寫-寫依然還是阻塞的
gap lock:間隙鎖,用於解決mysql中rr級別的幻讀問題,如果乙個事務操作的是乙個區間的資料,會鎖住這個區間所有的記錄,即使這個記錄不存在,這個時候另乙個會話去插入這個區間的資料,就必須等待上乙個結束。需要注意的是在此有可能會產生gap死鎖,例如下圖
問題5:mysql的悲觀鎖與樂觀鎖
無論悲觀鎖和樂觀鎖都是併發控制主要採用的技術手段,都是為了保證資料庫中的資料的完整性與一致性
悲觀鎖:對資料被外界修改持保守態度 (悲觀),因此,在整個資料處理過程中,將資料處於鎖定狀態。 悲觀鎖的實現,往往依靠資料庫提供的鎖機制,而悲觀鎖一般流程如下在對任意記錄進行修改前,先嘗試為該記錄加上排他鎖(exclusive locking)
如果加鎖失敗,說明該記錄正在被修改,那麼當前查詢可能要等待或者丟擲異常。 具體響應方式由開發者根據實際需要決定。
如果成功加鎖,那麼就可以對記錄做修改,事務完成後就會解鎖了。
悲觀鎖主要用於資料爭用激烈的環境,以及發生併發衝突時使用鎖保護資料的成本要低於回滾事務的成本的環境中。在效率方面,處理加鎖的機制會讓資料庫產生額外的開銷,還有增加產生死鎖的機會;另外,在唯讀型事務處理中由於不會產生衝突,也沒必要使用鎖,這樣做只能增加系統負載,還有會降低了並行性。
悲觀鎖的應用
樂觀鎖:假設認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。在對資料庫進行處理的時候,樂觀鎖並不會使用資料庫提供的鎖機制。一般的實現樂觀鎖的方式就是記錄資料版本。當讀取資料時,將版本標識的值一同讀出,資料每更新一次,同時對版本標識進行更新。
當我們提交更新的時候,判斷資料庫表對應記錄的當前版本資訊與第一次取出來的版本標識進行比對
如果資料庫表當前版本號與第一次取出來的版本標識值相等,則予以更新,否則認為是過期資料。
樂觀鎖的應用
2.mongodb部分
問題:問題1:mongodb的儲存引擎以及底層儲存機制
問題2:mongodb的版本變遷既特性
回答:問題1:
儲存引擎如下:mmap:
rocksdb:特性:順序寫入:lsm tree結構,隨機寫入轉換為順序寫入;速度穩定:和wiredtiger相比,寫速度穩定
memory
底層儲存機制:空間區域性性原理,b樹
問題2:
mongodb 3.0特性(2023年):順序寫入:lsm tree結構,隨機寫入轉換為順序寫入,速度穩定:和wiredtiger相比,寫速度穩定
mongodb 4.0特性(2023年6月):多文件事務支援,4.2版本開始支援分片集群分布式事務
3.redis部分
問題:問題1:redis支援的資料型別常用使用場景
問題2:redis的儲存機制以及常用集群
回答問題1:
redis支援的資料型別主要有string,list,set,zset,hash
redis的常用使用場景作為熱資料的快取資料庫,快取高頻次訪問的資料,降低資料庫的io
分布式架構,做session共享
利用zset型別可以做儲存排行榜
利用list做簡易mq或儲存最新的n個資料
問題2:
redis的儲存機制有list鍵:雙向鍊錶
hash鍵:字典dict
zset鍵:跳躍表zskiplist
ziplist:節省記憶體空間
常用集群方式有twitter開發的twemproxy
豌豆莢開發的codis
redis官方的redis-cluster
ok
p 是什麼意思?
利用指標引用陣列元素,比較方便靈活,有不少技巧。在專業人員中常喜歡用一些技巧,以使程式簡潔。在看別人寫的程式時可能會遇到一些令人混淆的情況,要仔細的分析。請分析下面幾種情況 設p開始時指向陣列a的首元素 即p a 分析 p pi p 使p指向下一元素a 1 然後若再執行 p,則得到下乙個元素 a 1...
python是什麼意思 python是什麼
python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。python 是一種解釋型語言 這意味著開發過程中沒有了編譯這個環節。類似於php和perl...
python是什麼意思 python是什麼意思
近幾年來,python一直發展比較迅速,同時也受到了很多人的關注,對於it行業的人來說,python並不是很陌生,但是對於其他行業的來說,並不知道python是什麼意思,下面我們來詳解一下python。一 python是什麼 python最初是用來編寫自動化指令碼,隨著不斷的發展,目前python被...