第十單元 索引與視圖

来源:https://www.cnblogs.com/xuyubing/archive/2023/12/18/17911652.html
-Advertisement-
Play Games

1. 常見的數據結構 1. 棧(stack) 特點:先進後出,後進先出 2. 隊列(Queue) 特點:先進先出 3. 數組(Array) 查詢速度快:通過地址值與索引可快速定位到數據 刪除效率低:刪除數據後,要將每個數據前移 添加效率極低:添加位置後,每個數據都後移,再添加數據。 4. 鏈表 鏈接 ...


1. 常見的數據結構

1. 棧(stack)

特點:先進後出,後進先出

 

 

2. 隊列(Queue)

特點:先進先出

 

 

 

3. 數組(Array)

 

  1. 查詢速度快:通過地址值與索引可快速定位到數據

  2. 刪除效率低:刪除數據後,要將每個數據前移

  3. 添加效率極低:添加位置後,每個數據都後移,再添加數據。

 

4. 鏈表

 

  1. 鏈接中的數據都是游離存儲的,每個元素節點包含元素值與下一個元素的地址

  2. 查詢速度慢,因為每次查詢都要通過head 指針依次查詢

  3. 添加,刪除效率相對較高,因為只需要將指針重新指向新添加進來的元素,其他元素的位置不需要動。

 

 

5. 二叉樹

二叉樹,全名叫二叉搜索樹。存入的數據以第一條數據為基準,小於放左,大於放右。

 

  1. 只能有一個根節點,每個節點最多支持兩個直接子節點

  2. 節點的度:節點擁有的子數的個數。節點的度數不大於2,如果度數為0,則稱為葉子節點或者終端節點。

  3. 二叉樹節點的深度:指從根節點到該節點的最長簡單路徑邊的條數。

  4. 二叉樹節點的高度:指從該節點到葉子節點的最長簡單路徑邊的條數。

 

缺點

雖然二叉樹可以提高一些效率,但是面對節點多時,或者樹的深度很高時,還是會面臨著查找速度慢的情況,而且還很容易出現退化鏈表情況( 存放數據是有序 的時候)。

 

6. 平衡二叉樹

數據結構線上地址: Data Structure Visualization (usfca.edu)

平衡二叉樹是在滿足二叉查找樹的情況下,儘可能的讓樹的度數變低,以提高查詢效率。

 

要求:任意節點的兩個左右子樹高度差不超過1,任意節點的左右子樹都是一個平衡二叉樹。

 

他底層在二叉樹的基礎上,對進行插入和刪除操作時通過特定操作(如左旋轉,右旋轉等)保持二叉查找樹的平衡,從而獲得較高的查找性能。

什麼是左旋轉,右旋轉呢?
左旋轉:被旋轉的節點從左側上升到父節點
右旋轉:被旋轉的節點從右側上升到父節點

 

缺點:

  1. 樹的深度過高,還是查詢慢

  2. 無法解決迴旋查找問題。

  3. 添加節點效率過低,因為節點旋轉有可能牽一發而動全身

 

7. 紅黑樹

紅黑樹是一種自平衡的二叉查找樹,是電腦中用到的一種數據結構,1972年出現,當時又被稱為“平衡二叉B樹”。1978年被修改為“紅黑樹”。每一個節點可以是紅或者黑;紅黑樹不是通過高度平衡的,它的平衡是通過“紅黑規則”進行實現的。

 

紅黑規則:

  1. 每一個節點或是紅色的,或者是黑色的,根節點必須是黑色。

  2. 如果某一個節點是紅色,那麼它的子節點必須是黑色(不能出現兩個紅色節點相連的情況)。

  3. 對每一個節點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色節點。

  4. 如果一個節點沒有子節點或者父節點,則該節點的相應指針屬性值為Null,這些Null視為葉節點,葉節點是黑色。

添加節點:

  1. 添加的節點的顏色,可以是紅色的,也可以是黑色的。

  2. 預設用紅色效率高。(調整節點的次數會相對減少)

紅黑樹增刪改查性能都比較好。

相對於要求嚴格的AVL樹來說,它的旋轉次數變少,所以對於搜索、插入、刪除操作多的情況下,我們就用紅黑樹。

 

缺點: 雖然紅黑樹的深度已經較二叉樹有所提升,但是當數據量過大時,如上萬或者上百萬條數據時他是深度會隨之變高。效率較慢,而且紅黑樹和二叉樹都有一個問題,就是迴旋查找。

 

迴旋查找

紅黑樹筆記中的案例圖,要找比 6 小的數,它需要先找到6的位置然後迴旋回去找父節點7,然後7還要去找5,然後一級一級找出所有小於6的數據 ,這樣就十分緩慢 。

 

8. B 樹

B樹又稱為多路平衡樹。(Balance Tree),也叫B-樹,他在樹的基礎上對節點進行橫向的拉伸

B-樹有如下特點:

所有鍵值分佈在整顆樹中(索引值和具體data都在每個節點里);

任何一個關鍵字出現且只出現在一個結點中;

搜索有可能在非葉子結點結束(最好情況O(1)就能找到數據);

在關鍵字全集內做一次查找,性能逼近二分查找;

 

規則

  1. 每個結點最多有m個棵子樹(m 稱為階)

  2. 除根結點外,其他每個分支結點至少有ceiling(m/2)棵子樹 (ceiling 表示向上取整)

  3. 根結點至少包含兩棵子樹(除非B樹只包含一個結點)

  4. 所有葉結點在同一層上,B樹葉結點可以外成是外部結點,不包含任何信息。

  5. 有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. 索引設計原則

是不是索引越多越好?

肯定不行。

  1. 索引也是需要空間存儲,索引太多意味著占用的空間也越多。

  2. 索引頁也需要系統維護,在增、刪、改 數據時索引需要重新編排。就好像一本書某一頁被撕掉了,對應的目錄也需要重新進行編排。

  3. 索引堆積久了,由於維護數據過程中會產生過多的索引碎片,反而不利於數據查詢。

 

什麼情況下可以建立索引?

  1. 主鍵一定要建

  2. 外鍵一定要

  3. 經常查詢的列

  4. 經常用作查詢條件的列

  5. 經常用在order by ,group by, distinct 後面的列

  6. 重覆值比較多的列不能建立索引

  7. 對於text,image,bit 這些類型的欄位不能建立索引

  8. 經常存取的列不要建立索引

 

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. 視圖

視圖的作用:
  1. 提高安全性

  2. 簡化查詢過程

什麼是視圖

視圖是用於簡化查詢過程、提高資料庫安全性的資料庫虛擬表對象。視圖的本質,其實就是一堆封裝好的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

 
  海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 將內容從 Word 文檔中提取出來可以方便我們對其進行其他操作,如將內容儲存在資料庫中、將內容導入到其他程式中、用於 AI 訓練以及製作其他文檔等。第三方庫 Spire.Doc for Python 提供了一個簡單的方法直接提取 Word 文檔中的內容,包括文本和圖片,而不需要大量的複製粘貼操作,也 ...
  • 我們討論網路編程中的IO模型時,需要先明確什麼是IO以及IO操作為什麼在程式開發中是很關鍵的一部分,首先我們看下IO的定義。 IO的定義 IO操作(Input/Output操作)是電腦系統中的一種重要操作,用於數據的輸入和輸出,通常涉及到電腦與外部設備(如硬碟、網卡、鍵盤、滑鼠、印表機等)之間的 ...
  • 一、要求 1.設計並驗證如下演算法:圖採用鄰接矩陣表示,實現無向圖的深度優先搜索與有向圖的廣度優先搜索。 2.設計並驗證如下演算法:帶權圖採用鄰接表表示,實現無向圖的廣度優先搜索與有向圖的深度優先搜索。 二、代碼 1. #include<stdio.h> #include<stdlib.h> #incl ...
  • 數據的預處理是數據分析,或者機器學習訓練前的重要步驟。通過數據預處理,可以 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加 ...
  • `QListWidget` 是 Qt 中的一個列表框組件,用於顯示一列項目,並允許用戶進行選擇。每個項目可以包含一個圖標和文本,可以使用 `QListWidgetItem` 類來表示。`ListWidget`組件與`TreeWidget`有些相似,區別在於`TreeWidget`可以實現嵌套以及多字... ...
  • WebAPI部署到IIS 1 開啟IIS功能 控制面板->程式->程式和功能->啟用或關閉Windows功能,以下打勾: 2 下載對應版本的dotNet Core 本文為ASP .NET Core6.0版本,需下載對應6.0版本的運行時,下載地址:https://dotnet.microsoft.c ...
  • 1. 簡單需求 通過圖文識別讀取一個指定window視窗的文本。 獲取視窗句柄,截圖保存成bitmap ,調用圖文識別庫. 測試結果是對中文下的識別不是特別好。 需要註意的是,tessdata要下載指定目錄頁下。 2. 引用包 a. 引用 tesseract4.1 b. Emgu.CV組件 3. 上 ...
  • 前言 本人最近在社區里說想做稚暉君的那個瀚文鍵盤來著,結果遇到兩個老哥一個老哥送了我電路板,一個送了我焊接好元件的電路板,既然大家這麼捨得,那我也就真的投入製作了這把客制化鍵盤,當然我為了省錢也是特意把外殼模型重新切割,用3D印表機列印了整個外殼,不得不說省了八九百的CNC費用。鍵盤介紹我就不說了, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...