1. 程式人生 > >【數據庫】

【數據庫】

可能 blog varchar 範圍 就是 ria lec 允許 eat

1.談談對Mysql索引的認識。

  • 主鍵查詢走索引,我們一般使用的索引都是Btree索引;
  • MyISAM和InnoDB索引結構有很大差異,這裏以InnoDB為例,InnoDB的葉節點存儲的是數據的行,而除了主鍵之外的列索引存儲的是主鍵key,也就是說在查詢的時候需要二次查詢,先通過列索引找到主鍵,再通過主鍵索引找到row。

技術分享圖片

  • 針對我們經常查詢的多列場景,我們可以建組合索引,組合索引在可以盡可能多的運用列的查詢規則。說到組合索引那麽必須說一下最左前綴原則:指的的是在sql where子句中一些條件或表達式中出現的列的順序要保持和多索引的一致或以多列索引順序出現,只要出現非順序出現、斷層都無法利用到多列索引。
  • 索引的區分度,主要是衡量索引值不相同的程度,區分度越大,越有利於索引的查詢。
  • 組合索引的順序和區分度:對於多個列構成的組合索引,在查詢過濾的時候也是和列的位置有關的,這也是最左前綴規則說的事情,也就是說如果在第一次能過濾掉大量的數據,那麽後續的索引匹配就能減少很多消耗。所以在選擇索引順序的時候最好是要考慮到區分度的問題,將區分度比較高的列放在前面。
  • 只有當索引的列順序和Order By子句的順序完全一致時,並且所有的列的排序方向都一樣時,才能使用索引對子句進行排序。
  • 應該註意的幾點:在使用索引查詢的時候,需要保證索引類型和查詢的數據類型一致,經常混用的是用int型查詢varchar類型的數據或反過來,這樣會導致索引失效;range查詢要盡量放在後面,因為在range後面的查詢不會走索引,這一點在設計索引時要註意;Like查詢不能前綴模糊匹配,也就是說不可以like ‘%123’,因為like的後綴模糊 like ‘123%’可以轉化為range查詢,但是前綴模糊不可以;索引不是越多越好,索引十分大時不僅會影響查詢效率,同時會為數據的插入造成很大的負擔;對於重復索引需要刪除,規劃好索引是高效率的前提。
  • 主鍵索引和唯一索引的區別:主鍵一定會創建一個唯一索引,但是有唯一索引的列不一定是主鍵;主鍵不允許為空值,唯一索引列允許空值;一個表只能有一個主鍵,但是可以有多個唯一索引主鍵可以被其他表引用為外鍵,唯一索引列不可以;主鍵是一種約束,而唯一索引是一種索引,是表的冗余數據結構,兩者有本質的差別。

2.MySql的事務隔離級別有哪幾種?

  • 隔離級別用於表述並發事務之間的相互幹擾程度,其基於鎖機制進行並發控制。
  • 可序列化(Serializable):事務一個接一個的執行,完全相互獨立;實現可序列化要求在選定對象上的讀鎖和寫鎖保持直到事務結束後才能釋放;在SELECT的查詢中使用一個WHERE子句來描述一個範圍時應該獲得一個“範圍鎖”。
  • 可重復度(Repeatable Read):事務A讀取數據之後,對涉及的數據加鎖,不允許其他事務進行修改,由於其他事務會插入新的數據,因此會產生幻讀;對選定對象的讀鎖和寫鎖一直保持到事務結束,但不要求“範圍鎖”,因此可能會發生幻讀;可重復讀是MySQL的默認事務隔離級別。
  • 讀取已提交(Read Committed):只能看到其他事務已經提交的數據,避免了臟讀,但存在不可重復讀、幻讀;DBMS需要對選定對象的寫鎖(write locks)一直保持到事務結束,但是讀鎖(read locks)在SELECT操作完成後馬上釋放,且不要求“範圍鎖”。
  • 讀取未提交(Read Uncommitted):可以看到其他事務沒有提交的數據,出現臟讀、不可重復讀、幻讀;

[PS補充]
不可重復讀的重點是修改:同樣的條件,讀取過的數據,再次讀取出來發現值不一樣了。
幻讀的重點在於新增或者刪除:同樣的條件,第1次和第2次讀出來的記錄數不一樣。

3.MySql的MVVC有什麽作用?

  • 多版本並發控制(MVCC),來實現MySQL上的多事務並發訪問時,隔離級別控制;
  • 數據版本:並發事務執行時,同一行數據有多個版本;
  • 事務版本:每個事務都有一個事務版本;
  • 版本有序:版本是通過時間來標識的;
  • 通過MVCC實現的效果是同一時刻、同一張表、多個並發事務,看到的數據是不同的。
  • MVCC本質使用了copy-on-write,為每個數據保留多份snapshot,不同snapshot之間,使用指針連接成鏈表;update操作,能看到的snapshot是受限的,是鏈表上小於等於當前事務版本的最大版本(讀取已提交:離當前事務最近的已提交版本);

【數據庫】