jedis取存 数据库查到的对象_Mysql数据库索引BAT面试必问
1.你能說說什么是索引嗎?
在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
2.索引具體采用的哪種數據結構呢?
常見的MySQL主要有兩種結構:Hash索引和B+ Tree索引,我們使用的是InnoDB引擎,默認的是B+樹
3.既然提到InnoDB使用的B+ 樹的索引模型,那么你知道為什么采用B+ 樹嗎?這和Hash索引比較起來有什么優缺點嗎?
一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上,這樣,索引查找過程中就要產生磁盤IO消耗。因此,選擇數據結構時,索引的結構組織要盡量減少查找過程中磁盤IO的存取次數。 磁盤預讀可以通過IO效率(局部性原理),預讀的長度一般為頁的整數倍。數據庫系統巧妙利用了磁盤預讀原理,將一個節點的大小設為一個頁,這樣每個節點只需要一次IO就可以完全載入。每次新建節點時,直接申請一個頁的空間,這樣就保證了一個節點物理上也存儲在一個頁,加之計算機存儲分配都是按頁對齊的,就實現了一個節點只需要一次IO。 B樹中一次檢索最多需要h-1次IO(根節點常駐內存),漸進復雜度為O(h)=O(logdN)。一般應用中,出度d是非常大的數字,因此h非常小(通常不超過3)。紅黑樹這種結構,h明顯要深的多,由于邏輯上很近的節點(父子)物理上可能很遠,無法利用局部性。紅黑樹的IO漸進復雜度也為O(h),效率明顯比B樹差很多。
B+樹更適合外索引,原因和內節點出度d有關,d越大索引性能越好,而出度的上線取決于節點內key和data的大小,由于B+樹內節點去掉了data域,因此可以擁有更大的出度,擁有更好的性能。dmax = floor(pagesize / (keysize + datasize + pointsize)) (pagesize – dmax >= pointsize)
和Hash索引比較
1) Hash索引哈希索引適合等值查詢,不適合范圍查找,而B+樹特別適合范圍查找(特別是聚簇索引的時候)
2)Hash索引每次查詢要加載所有的索引數據到內存當中,哈希索引沒辦法利用索引完成排序 ,而B+樹只需要根據匹配規則選擇對應的葉子數據加載即可
3)另外B+樹引入了緩存機制 和 數據頁技術來提升性能(不過理論上來說,這兩個特性Hash索引也可以實現)
4)如果有大量重復鍵值的情況下,哈希索引的效率會很低,因為存在哈希碰撞問題
4.B+ Tree的葉子節點都可以存哪些東西?以及區別?
InnoDB的B+ Tree可能存儲的是整行數據,也有可能是主鍵的值;
在 InnoDB 里,索引B+ Tree的葉子節點存儲了整行數據的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引;
聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲并不連續聚集索引:物理存儲按照索引排序;
聚集索引是一種索引組織形式,索引的鍵值邏輯順序決定了表數據行的物理存儲順序。非聚集索引:物理存儲不按照索引排序;
非聚集索引則就是普通索引了,僅僅只是對數據列創建相應的索引,不影響整個表的物理存儲順序。
索引是通過二叉樹的數據結構來描述的,我們可以這么理解聚簇索引:索引的葉節點就是數據節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
優勢與缺點:
聚集索引插入數據時速度要慢(時間花費在“物理存儲的排序”上,也就是首先要找到位置然后插入),查詢數據比非聚集數據的速度快。
5.聚簇索引查詢會更快,為什么?
因為主鍵索引樹的葉子節點直接就是我們要查詢的整行數據了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以后,還需要再通過主鍵的值再進行一次查詢;
6. 剛剛你提到主鍵索引查詢只會查一次,而非主鍵索引需要回表查詢多次。(這個過程叫做回表)是所有情況都是這樣的嗎?非主鍵索引一定會查詢多次嗎?
覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就能夠取得,不必從數據表中讀取。也可以稱之為實現了索引覆蓋。
當一條查詢語句符合覆蓋索引條件時,MySQL只需要通過索引就可以返回查詢所需要的數據,這樣避免了查到索引后再返回表操作,減少I/O提高效率。
如,表covering_index_sample中有一個普通索引 idx_key1_key2(key1,key2)。
當我們通過SQL語句:select key2 from covering_index_sample where key1 = 'keytest';的時候,就可以通過覆蓋索引查詢,無需回表。
7.創建索引需要考慮哪些因素
1)非空字段:應該指定列為NOT NULL,因為含有空值的列很難進行查詢優化,因為他們使得索引、索引的統計信息以及比較運算更加復雜
2)取值離散大的字段
3)索引字段越小越好:數據庫的數據存儲以頁為單位,一頁存儲的數據越多,一次IO操作獲取的數據越大,效率越高
4)建立索引的時機:若表中的某字段出現在select、過濾、排序條件中,為該字段建立索引是值得的。5)對于like '%xxx'的模糊查詢,普通的索引是無法滿足的,需要建立全文索引。 6)對于有多個條件的,比如: "...where a=xxx and b=yyy","...where a=xxx order by b","...where a=xxx group by b"。需要使用組合索引。但是組合索引只能在SQL語句中滿足"最左前綴"的條件下使用。且組合索引有一些副作用,如索引尺寸可能比數據本身大,因為組合索引的組合條目多。所以在實際應用中,要量身定做,使用慢查詢分析工具分析。 7)開啟索引緩存,直接在內存中查找索引,不用再磁盤中。8)建立索引是有代價的,當update、delete語句執行時,會使得索引更新,將耗掉更多的時間。可以使用mysqlreport報告,了解select、update、delete、insert、replace各語句所占的百分比。
9)表的數據量,一般實際開發中20W以上數據我們考慮索引
8.索引的規則:(在MySQL 5.6中,對索引做了哪些優化嗎,主要是索引下推)
9.排查的時候,有什么手段可以知道有沒有走索引查詢呢
通過explain查看sql語句的執行計劃,通過執行計劃來分析索引使用情況
10.什么情況下會發生明明創建了索引,但是執行的時候并沒有通過索引呢?
查詢優化器?
一條SQL語句的查詢,可以有不同的執行方案,至于最終選擇哪種方案,需要通過優化器進行選擇,選擇執行成本最低的方案。
在一條單表查詢語句真正執行之前,MySQL的查詢優化器會找出執行該語句所有可能使用的方案,對比之后找出成本最低的方案。
這個成本最低的方案就是所謂的執行計劃。優化過程大致如下:
1、根據搜索條件,找出所有可能使用的索引
2、計算全表掃描的代價
3、計算使用不同索引執行查詢的代價
4、對比各種執行方案的代價,找出成本最低的那一個
11.索引的優化策略:
12.索引的鎖機制
總結
以上是生活随笔為你收集整理的jedis取存 数据库查到的对象_Mysql数据库索引BAT面试必问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片转svg标注_两个免费网站轻松搞定图
- 下一篇: 平安产险_平安产险史良洵:财产险未来三大