mysql面試題彙總

 一、索引的失效場景:

1、模糊查詢Like 使用如%like,將不走索引。

2、在索引字段是上使用函數,將不走索引,因爲使用索引的字段都是數據表中的字段,如果使用了函數將導致該字段的所有值都將參數計算,成本太大。

3、在建立符合索引時沒有遵循最左匹配原則,那麼什麼是最左匹配原則呢?比如在(name,age,sex)上建立索引,如果查詢時age=28 and sex =“男” 或 sex =“男” 或 age=28 都將放棄使用索引。

4、在普通索引情況下使用 != , >= , <=  都將不走索引,在主鍵索引時走的

5、order by在普通索引下,select 字段時 from table,字段也必須是索引字段,否則將不走索引,因爲我們在排序時如果查詢的字段不存在將導致查詢的字段還需要再次定位到相關字段。

6、普通索引在類型不匹配的,將不走索引。

二、創建索引應該注意什麼呢,基於上面的失效場景。

1、遵循最左匹配原則。

2、儘量選擇區分度高的列作爲索引,也就是說使用乾淨一點的數據。

3、小表不使用索引,因爲小表也佔用內存空間。

4、索引列不能參與計算

三、索引的分類

1、普通索引

2、唯一索引 主鍵索引不能爲空,唯一索引可以爲空

3、聯合索引  聯合主鍵索引 聯合唯一索引 聯合普通索引

4、全文索引 大文本的情況下使用

5、空間索引

四、索引的原理:mysql主要是使用b+樹來實現的

我們先來一張圖:圖片來源https://www.cnblogs.com/bypp/p/7755307.html

                    

b+樹是b樹的一種拓展,那麼b樹又是什麼呢?我們先來看下b樹的定義

假設存在B樹T存在節點x,那麼有如下性質

1、每個節點x
    有下面屬性: 
  a. x.n,當前存儲在節點x中的關鍵字的個數。 
  b. x.n個關鍵字本身x.key1,x.key2,...,x.keyx.n


 2、每個內部節點x包含x.n+1個指向其孩子的指針x.c1,x.c2,...,x.cx.n+1 。葉節點沒有孩子,所以他們的ci屬性沒有意義。 

3、關鍵字x.keyi對存儲在各子樹中的關鍵字範圍加以分割:如果ki 爲任意一個存儲在x.ci爲根的子樹中的關鍵字,那麼 k1<=x.key1<=k2<=x.key2<=...<=x.keyx.n<=kx.n+1

4、每個葉節點具有相同的深度,即樹的高度h。

5、每個節點所包含的關鍵字個數有上界和下界。用一個被稱爲B樹的最小度數的固定整數t>=2來表示這些界。 
      a. 除了根節點以外的其他每個節點必須至少有t−1個關鍵字。因此除了根節點外每個內部節點至少有t個孩子。如果樹非空,根  節點至少有一個關鍵字。 
      b. 每個結點至多包含2t-1個關鍵字。因此一個內部節點至多可有2t個孩子。當一個節點恰好有2t-1個關鍵字時,稱該節點是滿 的。 

那麼B+樹有什麼性質呢:

根據上面的補充:

1、子樹的個數與父節點的關鍵字個數相同

2、每個節點的關鍵字是子樹的最大值或最小值的集合

3、內部節點不存衛星數據,衛星數據全部都在葉節點上。

4、所有的葉節點形成一個雙向鏈表

分析一下上面的圖:

###b+樹的查找過程
如圖所示,如果要查找數據項29,那麼首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針,內存時間因爲非常短(相比磁盤的IO)可以忽略不計,通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,通過指針加載磁盤塊8到內存,發生第三次IO,同時內存中做二分查找找到29,結束查詢,總計三次IO。真實的情況是,3層的b+樹可以表示上百萬的數據,如果上百萬的數據查找只需要三次IO,性能提高將是巨大的,如果沒有索引,每個數據項都要發生一次IO,那麼總共需要百萬次的IO,顯然成本非常非常高。

###b+樹性質
1.索引字段要儘量的小:通過上面的分析,我們知道IO次數取決於b+數的高度h,假設當前數據表的數據爲N,每個磁盤塊的數據項的數量是t,則有h=㏒t(n+1)/2,當數據量N一定的情況下,t越大,h越小;而t = 磁盤塊的大小 / 數據項的大小,磁盤塊的大小也就是一個數據頁的大小,是固定的,如果數據項佔的空間越小,數據項的數量越多,樹的高度越低。這就是爲什麼每個數據項,即索引字段要儘量的小,比如int佔4字節,要比bigint8字節少一半。這也是爲什麼b+樹要求把真實的數據放到葉子節點而不是內層節點,一旦放到內層節點,磁盤塊的數據項會大幅度下降,導致樹增高。當數據項等於1時將會退化成線性表。

2.索引的最左匹配特性(即從左往右匹配):當b+樹的數據項是複合的數據結構,比如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最後得到檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因爲建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪裏查詢。比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等於張三的數據都找到,然後再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。

五、最後看看mysql連接數的配置,以及配置原則

這個是可以閱讀一下這篇文章:https://www.jianshu.com/p/a8f653fc0c54

線程數 = (cpu*2)+ 有效磁盤數  所以最大和最小應該根據這個來 並設置一個等待隊列 看tomcat使用的同步隊列

一般情況下,隊列的大小遵循下面的公式:

queSize <= ClientTimeOut(秒) * TPS

隊列大小 小於等於 客戶端超時 * 每秒處理的交易數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章