數據庫面試題:索引

7、存儲過程

定義:指完成特定功能的SQL語句集,編譯創建並保持在數據庫中,通過調用用戶指定的存儲過程名稱和參數(有需要時)使用,是數據庫層面的封裝和重用。

優點:存儲過程可以封裝,並隱藏商業邏輯等,存儲過程可以回傳值,接受參數,用在數據校驗

缺點:特定在數據庫上,移植時更改語句;撰寫和性能調校受限於數據庫系統

13、MySQL數據庫索引相關知識

  • 爲什麼要給表加上主鍵?

  • 爲什麼加索引後會使查詢變快?

  • 爲什麼加索引後會使寫入、修改、刪除變慢?

  • 什麼情況下要同時在兩個字段上建索引?

索引的目的是:提高檢索速度

索引的原理:一般的數據庫索引都是以平衡樹爲數據結構,重要的事情說三遍“平衡樹,平衡樹,平衡樹”(b樹或者b+樹)

使用平衡樹之前我們先了解一下二叉排序樹,根據二叉排序樹的特點我們就可以將查找的次數平均降低一半,但是一種極端情況是所有數據都在二叉排序樹的一側,所以又設計的平衡二叉樹,在二叉排序樹的基礎上,讓兩側的左右子樹的高度差值小於等於1,。這樣就確保了查詢效率是O(logn)

聚集索引和非聚集索引,組合索引,普通索引,唯一索引

聚集索引:有的數據庫創建表的時候如果不指名錶的主鍵,就會不允許創建表。當我們爲表創建了主鍵,其實這個時候已經不能稱爲“表”,一個沒有創建主鍵的表,我們可以把他看成表,一行行數據排列到磁盤上,但是一旦創建了主鍵,那麼他在磁盤中存儲就變成了一棵樹,整個表就變成了一個索引,也就是主鍵將一個“表”格式的變成了一棵樹形式的存放方式。這就是爲什麼表只能有一個主鍵和一個聚集索引。帶主鍵的表就是聚集索引,除了葉子節點以外,其他樹的節點都是由主鍵字段構成。

葉子節點纔是真正的表中一條條的數據。我們學習數據結構中的平衡樹,計算他的查找次數,目的就是學習索引的底層結構,查找的次數少,IO的次數少,減少開銷,查找的時間就短。

非聚集索引,就是我們說的普通索引,每次給字段加一個索引,這個字段就會複製出一份,建立索引,每個索引相互獨立,也就是每棵平衡樹相互獨立,但是與聚集索引的區別是,通過聚集索引可以查找到數據,但是通過非聚集索引查找到的是數據對應的主鍵,然後再通過聚集索引查找到數據表中的數據。

不管以任何方式查詢表, 最終都會利用主鍵通過聚集索引來定位到數據, 聚集索引(主鍵)是通往真實數據所在的唯一路徑。

更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是由於索引本身也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創建索引。

對於兩個數據庫搜索引擎InnoDB和MyIsam兩個引擎,他的索引數據結構都是採用的是B+樹,但是MyIsam是非聚集索引,而InnoDB是聚集索引

================================================================================================

索引:實際說的就是一種數據結構,這裏我們簡單介紹三種索引模型,也是常用的索引模型。哈希表,有序數組,BTreee

其實講解三種數據結構的同時,我們順便就是把數據結構中的查找一章做了複習。查找的結構:

  • 線性結構:順序查找,折半查找,分塊查找
  • 樹形結構:二叉排序樹,二叉平衡樹,B-樹、B+樹
  • 散列結構:散列表(衝突處理)

散列結構:

線性結構:

1、一般線性表的查找,就是從線性表的一端,查找與target值相等的元素的下標,查找效率取決與元素個數O(n);

改進的是設置一個哨兵,num【0】 = key 從表的末尾找,目的是不用判斷數組是否越界,如果返回的下標大於0則找到了,如果返回0說明找到的是哨兵,查找失敗!

2、有序線性表的查找:這裏不接受從一端查找到另一端的方式,這裏介紹折半查找,也是二分查找,可以用二叉樹或者是判定樹來查找,查找的效率就是樹的高度O(\log_{2} n)

3、分塊查找:又稱爲索引順序查找,索引表中是有序的,可以用二分查找,快中是無序的。

樹形結構:

1、二叉排序樹:

2、二叉平衡樹:

3.B-樹:

4B+樹:

我們要知道數據庫分爲兩部分一個是server層另一就是引擎層,在引擎層的存儲的核心就是一些哈希表,有序數組,B樹模型,我們要分析他的數據模型,才能分析出這個數據庫適用的場景。索引的目的就是提高查詢速度,實現索引的方式又很多,這裏講三種常見的模型:哈希表,有序數組, 搜索樹。

哈希表是鍵值對存儲的數據結構,只要輸入key,就會找到對應的value。思路很簡單就是一個數組,給我一個key,我用某個hash函數計算他的地址,然後將這個值存儲到這個數組的位置。如果遇到衝突解決辦法是拉出一個鏈表,將衝突的都放到這個鏈表上,這個鏈表的key值沒有順序,爲了便於增加,但是對於區間的查找困難,就要全部掃描。所以哈希表適合等值查詢。

在等值查詢和範圍查找中有序數組做的很好,用二分查找,效率是logn,但是對於更新它就成本很高。

我們用一個例子說明,查詢用戶的身份證號來得到他的姓名,用二叉排序樹搜索實現。

想搜索user2用戶的姓名,每個節點的左兒子小於父節點,父節點又小於右兒子。這樣如果你要查ID_card_n2的話,按照圖中的搜索順序就是按照UserA -> UserC -> UserF -> User2這個路徑得到。這個時間複雜度是O(log(N))。 當然因爲二叉搜索樹有的時候可能是單邊樹,爲了搜索的複雜度,把他加侷限,採用二叉平衡樹,又因爲數據庫表中的索引值數以萬計,不僅要存在內存中,還要存進磁盤,爲了減少磁盤的讀,我們採用多路平衡樹,也就是B-樹或者b+樹,稍後說他們的區別。

在MySQL中,索引是在搜索引擎層實現的,索引並沒有統一的索引標準,即不同的搜索引擎不同的工作方式,即使多個引擎都支持一種索引,底層的實現也可能不同,我們以InnoDB來說,他的底層是B+樹。

InnoDB的表都是以主鍵爲索引的形式存放的,可以說InnoDB中存放的不是表是索引,是一棵B+樹,CREATE table test(
id int PRIMARY KEY,
k int NOT NULL,
name VARCHAR(10),
index (k)) 
ENGINE = INNODB ;
INSERT INTO test VALUES(1,101,'cs');
INSERT INTO test VALUES(2,102,'sjl');
INSERT INTO test VALUES(3,103,'c1');
INSERT INTO test VALUES(4,104,'c2');
INSERT INTO test VALUES(5,105,'c3');
INSERT INTO test VALUES(6,106,'c4');
INSERT INTO test VALUES(7,107,'c5');
alter table test change column id id int not null auto_increment;

SELECT * from test
EXPLAIN SELECT NAME from test where id = 4
show create table test;

在主鍵id的索引樹中葉子節點是一行數據,1,100,“cs”,但是在k上創建索引的索引樹葉子節點是主鍵id。索引可以分爲聚集索引和非聚集索引兩種,他們的劃分就是安裝索引和數據存儲的物理順序是否一致,字典中拼音目錄就是與字典中漢字真正存放的 地址對應的,按部首查的目錄就非聚集索引。主鍵索引就是聚集索引,所以聚集索引只有一個。但是,不管聚集索引還是非聚集索引最終都是要去在聚集索引樹上進行查詢的。

索引的維護,我們學過B樹的插入和刪除,這個過程很浪費資源,所以我們儘量在定義主鍵的時候是自增主鍵,primary key auto_increment

1、索引的最左匹配原則:這個說的是組合索引,

2、爲什麼用B+樹做索引的數據結構而不是哈希表?

3.主鍵索引和非主鍵索引的區別

4.爲什麼建議使用自增主鍵的索引 

5索引的種類知道多少?

6索引底層的原理知道多少?

7索引一般怎麼優化?

8、哪些情況下索引會失效

9、存儲引擎瞭解多少?兩個常用引擎的區別

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