1. 常見的數據結構 1. 棧(stack) 特點:先進後出,後進先出 2. 隊列(Queue) 特點:先進先出 3. 數組(Array) 查詢速度快:通過地址值與索引可快速定位到數據 刪除效率低:刪除數據後,要將每個數據前移 添加效率極低:添加位置後,每個數據都後移,再添加數據。 4. 鏈表 鏈接 ...
1. 棧(stack)
特點:先進後出,後進先出
2. 隊列(Queue)
特點:先進先出
3. 數組(Array)
-
查詢速度快:通過地址值與索引可快速定位到數據
-
刪除效率低:刪除數據後,要將每個數據前移
-
添加效率極低:添加位置後,每個數據都後移,再添加數據。
4. 鏈表
-
鏈接中的數據都是游離存儲的,每個元素節點包含元素值與下一個元素的地址
-
查詢速度慢,因為每次查詢都要通過head 指針依次查詢
-
添加,刪除效率相對較高,因為只需要將指針重新指向新添加進來的元素,其他元素的位置不需要動。
5. 二叉樹
二叉樹,全名叫二叉搜索樹。存入的數據以第一條數據為基準,小於放左,大於放右。
-
只能有一個根節點,每個節點最多支持兩個直接子節點
-
節點的度:節點擁有的子數的個數。節點的度數不大於2,如果度數為0,則稱為葉子節點或者終端節點。
-
二叉樹節點的深度:指從根節點到該節點的最長簡單路徑邊的條數。
-
二叉樹節點的高度:指從該節點到葉子節點的最長簡單路徑邊的條數。
缺點:
雖然二叉樹可以提高一些效率,但是面對節點多時,或者樹的深度很高時,還是會面臨著查找速度慢的情況,而且還很容易出現退化鏈表情況( 存放數據是有序 的時候)。
6. 平衡二叉樹
數據結構線上地址:
平衡二叉樹是在滿足二叉查找樹的情況下,儘可能的讓樹的度數變低,以提高查詢效率。
要求:任意節點的兩個左右子樹高度差不超過1,任意節點的左右子樹都是一個平衡二叉樹。
他底層在二叉樹的基礎上,對進行插入和刪除操作時通過特定操作(如左旋轉,右旋轉等)保持二叉查找樹的平衡,從而獲得較高的查找性能。
什麼是左旋轉,右旋轉呢?
左旋轉:被旋轉的節點從左側上升到父節點
右旋轉:被旋轉的節點從右側上升到父節點
缺點:
-
樹的深度過高,還是查詢慢
-
無法解決迴旋查找問題。
-
添加節點效率過低,因為節點旋轉有可能牽一發而動全身
7. 紅黑樹
紅黑樹是一種自平衡的二叉查找樹,是電腦中用到的一種數據結構,1972年出現,當時又被稱為“平衡二叉B樹”。1978年被修改為“紅黑樹”。每一個節點可以是紅或者黑;紅黑樹不是通過高度平衡的,它的平衡是通過“紅黑規則”進行實現的。
紅黑規則:
-
每一個節點或是紅色的,或者是黑色的,根節點必須是黑色。
-
如果某一個節點是紅色,那麼它的子節點必須是黑色(不能出現兩個紅色節點相連的情況)。
-
對每一個節點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色節點。
-
如果一個節點沒有子節點或者父節點,則該節點的相應指針屬性值為Null,這些Null視為葉節點,葉節點是黑色。
添加節點:
-
添加的節點的顏色,可以是紅色的,也可以是黑色的。
-
預設用紅色效率高。(調整節點的次數會相對減少)
紅黑樹增刪改查性能都比較好。
相對於要求嚴格的AVL樹
來說,它的旋轉次數變少,所以對於搜索、插入、刪除操作多的情況下,我們就用紅黑樹。
缺點: 雖然紅黑樹的深度已經較二叉樹有所提升,但是當數據量過大時,如上萬或者上百萬條數據時他是深度會隨之變高。效率較慢,而且紅黑樹和二叉樹都有一個問題,就是迴旋查找。
迴旋查找
紅黑樹筆記中的案例圖,要找比 6 小的數,它需要先找到6的位置然後迴旋回去找父節點7,然後7還要去找5,然後一級一級找出所有小於6的數據 ,這樣就十分緩慢 。
8. B 樹
B樹又稱為多路平衡樹。(Balance Tree),也叫B-樹,他在樹的基礎上對節點進行橫向的拉伸
B-樹有如下特點:
所有鍵值分佈在整顆樹中(索引值和具體data都在每個節點里);
任何一個關鍵字出現且只出現在一個結點中;
搜索有可能在非葉子結點結束(最好情況O(1)就能找到數據);
在關鍵字全集內做一次查找,性能逼近二分查找;
規則
-
每個結點最多有m個棵子樹(m 稱為階)
-
除根結點外,其他每個分支結點至少有ceiling(m/2)棵子樹 (ceiling 表示向上取整)
-
根結點至少包含兩棵子樹(除非B樹只包含一個結點)
-
所有葉結點在同一層上,B樹葉結點可以外成是外部結點,不包含任何信息。
-
有j 個孩子的非葉子結點恰好有 j-1 個關鍵字(關鍵碼),關鍵碼按遞增次序排列。
9. B+樹
也是一種多路搜索樹,和B樹類似,B+樹是B-樹的變體,但對B樹的基礎上,做了一些改變,類似於C/C++。
一棵m階的B+樹主要有這些特點:
-
每個結點至多有m個子女;
-
非根節點關鍵值個數範圍:ceiling⌈m/2⌉ - 1 <= k <= m-1
-
相鄰葉子節點是通過指針連起來的,並且是關鍵字大小排序的。
一顆3階的B+樹如下:
B+樹和B-樹的主要區別如下:
-
B-樹內部節點是保存數據的;而B+樹內部節點是不保存數據的,只作索引作用,它的葉子節點才保存數據。
-
B+樹相鄰的葉子節點之間是通過鏈表指針連起來的,B-樹卻不是。
-
查找過程中,B-樹在找到具體的數值以後就結束,而B+樹則需要通過索引找到葉子結點中的數據才結束
-
B-樹中任何一個關鍵字出現且只出現在一個結點中,而B+樹可以出現多次。
B+樹的插入 B+樹插入要記住這幾個步驟:
-
1.B+樹插入都是在葉子結點進行的,就是插入前,需要先找到要插入的葉子結點。
-
2.如果被插入關鍵字的葉子節點,當前含有的關鍵字數量是小於階數m,則直接插入。
-
3.如果插入關鍵字後,葉子節點當前含有的關鍵字數目等於階數m,則插,該節點開始「分裂」為兩個新的節點,一個節點包含⌊m/2⌋ 個關鍵字,另外一個關鍵字包含⌈m/2⌉個關鍵值。(⌊m/2⌋表示向下取整,⌈m/2⌉表示向上取整,如⌈3/2⌉=2)。
-
4.分裂後,需要將第⌈m/2⌉的關鍵字上移到父結點。如果這時候父結點中包含的關鍵字個數小於m,則插入操作完成。
-
5.分裂後,需要將⌈m/2⌉的關鍵字上移到父結點。如果父結點中包含的關鍵字個數等於m,則繼續分裂父結點。
2. 索引
作用
提高查詢速度.
定義
將結構化數據中的一部分信息提取出來,重新組織,使其變得有一定結構,我們將這部分信息稱之為索引.
1. 索引分類
聚集索引
聚集索引是一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引也稱為聚簇索引(Clustered Index) , 聚集索引是物理地址連續存放的索引
特點:只能有一個, 一般為主鍵(主鍵一定是聚集索引,聚集索引並不一定是主鍵)
什麼情況下主鍵不是聚集索引呢?
答:在建表的時候,並沒有加主鍵,這個時候如果說建立了一個聚集索引,再建立主鍵,那麼這個時候主鍵就不是聚集索引了。
非聚集索引
非聚集索引(NonClustered Index)是表中記錄的物理順序和邏輯順序不同的索引 (此外還有空間索引、篩選索引、XML索引)
特點:可以有多個(999)
索引說明
-
每張表上最大的聚集索引數為1;
-
每張表上最大的非聚集索引數為999;
-
每個索引最多能包含的鍵列數為16;
-
索引鍵記錄大小最多為900位元組
2. 索引數據結構
在SQL Server
資料庫中,索引的存儲是以B+樹(註意和二叉樹的區別)結構來存儲的,又稱索引樹,其節點類型為如下兩種:
-
索引節點(Key);
-
葉子節點( Key + Value)
索引節點按照層級關係,有時又可以分為根節點和中間節點,其本質是一樣的,都只包含下一層節點的入口值和入口指針;
葉子節點就不同了,它包含數據,這個數據可能是表中真實的數據行,也有可能是索引列值和行書簽,前者對應於聚集索引,後者對應於非聚集索引。
名詞介紹
B+Tree:一種數據結構( 也是一種多路平衡搜索樹 )
數據頁:資料庫保存數據的最小單位。(SQL Server
一個數據頁的大小是 8K,一個表中所有的數據都被保存到一個個的數據頁中)
索引組織表:大白話一張表有聚集索引就是索引組織表(把表中的數據頁以 B+Tree 的方式組織起來)
索引表:一個索引對應一張索引表,索引表中每條數據都對應一張數據頁。
3. 索引為什麼選擇B+樹
1、 B+樹的磁碟讀寫代價更低:B+樹的內部節點並沒有指向關鍵字具體信息的指針,因此其內部節點相對B樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入記憶體的需要查找的關鍵字也就越多,相對IO讀寫次數就降低了。
2、B+樹的查詢效率更加穩定:由於非終結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。
3、由於B+樹的數據都存儲在葉子結點中,分支結點均為索引,方便掃庫,只需要掃一遍葉子結點即可,但是B樹因為其分支結點同樣存儲著數據,我們要找到具體的數據,需要進行一次中序遍歷按序來掃,所以B+樹更加適合在區間查詢的情況,所以通常B+樹用於資料庫索引。
個人 認為資料庫索引採用B+樹的主要原因是:B樹在提高了IO性能的同時並沒有解決元素遍歷效率低下的問題,正是為瞭解決這個問題,B+樹應用而生。B+樹只需要去遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而B樹不支持這樣的操作或者說效率太低。
4. 索引設計原則
是不是索引越多越好?
肯定不行。
-
索引也是需要空間存儲,索引太多意味著占用的空間也越多。
-
索引頁也需要系統維護,在增、刪、改 數據時索引需要重新編排。就好像一本書某一頁被撕掉了,對應的目錄也需要重新進行編排。
-
索引堆積久了,由於維護數據過程中會產生過多的索引碎片,反而不利於數據查詢。
什麼情況下可以建立索引?
-
主鍵一定要建
-
外鍵一定要
-
經常查詢的列
-
經常用作查詢條件的列
-
經常用在order by ,group by, distinct 後面的列
-
重覆值比較多的列不能建立索引
-
對於
text,image,bit
這些類型的欄位不能建立索引 -
經常存取的列不要建立索引
5. 使用索引
語法格式
create [unique] [clustered / nonclustered]
index index_name
on table_name(column_name1, column_name2, …)
unique:唯一索引
clustered:聚集索引
nonclustered
:非聚集索引
index_name:索引名稱
-- 建立聚集索引 create clustered index idx_userinfo_Id on UserInfo(Id); -- 創建非聚集索引(nonclustered 可省略) create nonclustered index idx_userinfo_Account on UserInfo(Account); -- 創建唯一非聚集索引 create unique nonclustered index idx_userinfo_pwd on UserInfo(Pwd);
唯一特點:索引欄位必須唯一,但可以有一個值為NULL
查看索引
exec sp_helpindex 'dbo.UserInfo'
重命名索引
-- 重命名索引 -- exec sp_rename '表名.舊索引名','新索引名','index'; exec sp_rename 'userinfo.idx_userinfo_pwd','idx_userinfo_password','index';
刪除索引
drop index idx_userinfo_Id on UserInfo
重建索引
alter index 索引名稱 on 數據表名 rebuild
3. 視圖
視圖的作用:
-
提高安全性
-
簡化查詢過程
什麼是視圖
視圖是用於簡化查詢過程、提高資料庫安全性的資料庫虛擬表對象。視圖的本質,其實就是一堆封裝好的SQL。
如何使用視圖
創建視圖
語法格式:
create view 視圖名稱 as select column_name from table_name [where 條件] --創建視圖 create view v_studentscore as select a.*,b.Degree,c.Cno,Cname,d.* from Student a inner join Score b on a.Sno=b.Sno inner join Course c on b.Cno=c.Cno inner join Teacher d on c.Tno=d.Tno --使用視圖 select * from v_studentscore where nickname='張旭'
修改視圖
一定要記得把創建視圖的代碼保存起來,免得下次修改視圖的時候,又要重新寫一遍代碼,特別是被加密的視圖代碼。
alter view v_studentscore --with encryption -- 加密 as select a.*,b.Degree,c.Cno,Cname,d.* from Student a inner join Score b on a.Sno=b.Sno inner join Course c on b.Cno=c.Cno inner join Teacher d on c.Tno=d.Tno
刪除視圖
--刪除視圖
drop view v_studentscore
視頻配套鏈接:【SQLServer 資料庫高級階段】.net 6 開發系列 ,全網最新,最全!(已完結)_嗶哩嗶哩_bilibili
海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。