讀SQL學習指南(第3版)筆記08_視圖和索引

来源:https://www.cnblogs.com/lying7/archive/2023/08/31/17664868.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230829150945972-2083299480.png) # 1. 精心設計的應用程式通常會在保持實現細節私有的同時公開公有介面,以便未來在不影響最終用戶的情況下修改設計 ...


1. 精心設計的應用程式通常會在保持實現細節私有的同時公開公有介面,以便未來在不影響最終用戶的情況下修改設計

2. 視圖

2.1. 不同於數據表,視圖並不涉及數據存儲,不用擔心視圖會填滿你的磁碟空間

2.2. 一種數據查詢機制

2.3. 從用戶的視角來看,視圖和數據表沒什麼兩樣

3. 為什麼要使用視圖

3.1. 數據安全

3.1.1. 如果你創建了數據表並允許用戶查詢,用戶就可以訪問數據表中的每一行和每一列

3.1.2. 保持數據表的私有性(不授權任何用戶select許可),然後創建一個或多個視圖,忽略或模糊化(比如customer_vw.email列採用的'*'方法)敏感列

3.1.3. 虛擬私有資料庫(virtual private database,VPD)

3.1.3.1. Oracle Database用戶另一種選擇可以保護數據表的行列數據安全

3.1.3.2. VPD允許用戶對數據表施加策略,伺服器據此對用戶的查詢進行修改

3.2. 數據聚合

3.2.1. 生成報表的應用程式通常需要聚合數據

3.2.2. 將數據預先在數據表中聚合而不是使用視圖求和以極大地提高查詢性能

3.3. 隱藏複雜性

3.3.1. 為了使最終用戶免受複雜性的影響

3.4. 連接分區數據

3.4.1. 為了提升性能會將較大的數據表拆分為多個部分

3.4.2. 設計人員可以在無須強制資料庫用戶修改查詢的情況下改動底層數據的結構

4. 可更新視圖

4.1. MySQL、Oracle Database和SQL Server都允許用戶在遵守特定限制的前提下通過視圖修改數據

4.2. MySQL滿足下列條件,視圖就是可更新的

4.2.1. 沒有使用聚合函數(max()、min()、avg()等)

4.2.2. 視圖沒有使用group by或having子句

4.2.3. select或from子句中不存在子查詢,並且where子句中的任何子查詢都不引用from子句中的數據表

4.2.4. 視圖沒有使用union、union all或distinct

4.2.5. from子句至少包括一個數據表或可更新視圖

4.2.6. 如果有不止一個數據表或視圖,from子句只使用內連接

5. 索引

5.1. 查找資源內特定項的一種機制

5.2. 資料庫伺服器也使用索引來定位數據表中的行

5.3. 與普通的數據表不同,索引是一種以特定順序保存的專用數據表

5.4. 索引並不包含實體的所有相關數據,而是只包含那些可用於定位數據表中行的列,以及描述這些行所在的物理位置信息

5.5. 索引的作用就是使檢索數據表中行和列的子集實現便捷化,無須再檢查數據表中的每一行

5.6. MySQL 5.0版也提供了create index,但該命令被映射到alter table命令,仍然必須使用alter table命令創建主鍵索引

5.6.1. mysql-

-> ALTER TABLE customer
    -> ADD INDEX idx_email (email);

5.6.2. sql

CREATE INDEX dept_name_idx
    ON department (name);

5.7. MySQL也支持drop index命令,不過同樣是被映射到alter table命令

5.7.1. mysql

-> ALTER TABLE customer
    -> DROP INDEX idx_email;

5.7.2. sql

DROP INDEX idx_email; (Oracle)
DROP INDEX idx_email ON customer; (SQL Server)

5.8. MySQL用戶可以使用show命令查看特定數據表的所有索引

5.9. 所有的資料庫伺服器都允許查看可用的索引

5.10. 唯一索引

5.10.1. 提供普通索引所能提供的所有便利

5.10.2. 避免索引列出現重覆值

5.10.3. 只要有行插入或是索引列被修改,資料庫伺服器就會檢查唯一索引,以查看該值是否已經在數據表中的其他行存在

5.10.4. SQL Server和Oracle Database用戶只需在創建索引時加入unique關鍵字

5.10.4.1. sql

CREATE UNIQUE INDEX idx_email
    ON customer (email);

5.10.5. mysql

-> ALTER TABLE customer
    -> ADD UNIQUE idx_email (email);

5.11. 多列索引

5.11.1. 在創建多列索引時,必須仔細考慮哪一列在前,哪一列在後,這樣才能使索引儘可能地發揮作用

5.11.2. 如果需要確保充分的響應時間,完全可以基於不同順序為列的同一集合創建多個索引

5.11.3. mysql

-> ALTER TABLE customer
    -> ADD INDEX idx_full_name (last_name, first_name);

5.12. 索引類型

5.12.1. B樹索引

5.12.1.1. 平衡樹索引(balanced-tree index)

5.12.1.1.1. B樹索引(B-tree index)

5.12.1.2. MySQL、Oracle Database和SQL Server均預設採用B樹索引

5.12.1.3. B樹索引擅長處理包含大量不同值的列

5.12.2. 點陣圖索引

5.12.2.1. 對於那些只包含少量值卻占據了大量行的列(所謂的低基數數據)

5.12.2.2. 對於低基數數據而言,點陣圖索引是一種友好且緊湊的索引解決方案

5.12.2.3. 如果列中存儲的值的數量相較於行數攀升得過高(所謂的高基數數據),這種索引策略就不適合了,因為伺服器需要維護太多的點陣圖

5.12.2.4. Oracle Database引入了點陣圖索引(bitmap index),其為存儲在列中的每個值生成一個點陣圖

5.12.2.4.1. CREATE BITMAP INDEX idx_active ON customer (active);

5.12.2.5. 通常用於數據倉庫環境,其中大量數據通常在包含相對較少值的列(例如銷售季度、地理區域、產品、銷售人員)上進行索引

5.12.3. 文本索引

5.12.3.1. MySQL和SQL Server提供的是全文索引(full-text index)

5.12.3.2. Oracle Database提供了一套稱為Oracle Text的強大工具集

5.13. 允許用戶查看查詢優化器是如何處理SQL語句的

5.13.1. SQL Server用戶可以在執行SQL 語句之前通過發出set showplan_text on語句查看該語句的執行計劃

5.13.2. Oracle Database提供了explain plan語句,通過執行該語句可以將執行計劃寫入專用的數據表plan_table

5.14. 索引的不足

5.14.1. 索引並不是越多越好

5.14.1.1. 每個索引其實都是一個數據表(特殊類型的表)

5.14.1.2. 索引越多,伺服器就需要做越多的工作來保持所有模式對象都處於最新狀態,這會使伺服器的運行速度減慢

5.14.2. 索引需要磁碟空間,同時也需要管理員花費精力進行管理,因此對於索引的最佳策略就是僅當有明確需求時才添加索引

5.14.2.1. 如果出於一些特殊目的要用到索引,比如每月的例行維護工作,可以先添加索引,例行維護,然後再刪除索引,下次需要例行維護時再如此重覆

5.14.2.2. 數據被連夜載入到數據倉庫時就會出現問題,常見做法是在數據被載入之前撤銷索引,然後在數據倉庫開放業務之前重新創建索引

5.15. 索引不能太多,也不能太少

5.15.1. 確保所有主鍵列被索引

5.15.2. 對於多列主鍵,可以考慮為主鍵列的子集或是以不同於主鍵約束定義的順序為所有主鍵列創建額外的索引

5.15.3. 為所有被外鍵約束引用的列創建索引

5.15.4. 為被用於頻繁檢索數據的列創建索引

5.15.5. 除了短字元串(2~50個字元)列,大多數日期列也是不錯的候選對象

6. 約束

6.1. 施加於數據表中一列或多列的限制

6.1.1. 如果沒有約束,資料庫的一致性就會存疑

6.2. 主鍵約束

6.2.1. 標識一列或多列,保證其值在數據表中的唯一性

6.3. 外鍵約束

6.3.1. 限制一列或多列只能包含其他數據表的主鍵列中的值

6.3.2. on delete restrict

6.3.2.1. on delete restrict,如果刪除了父表(address或store)中被子表(customer)引用的行,伺服器會引發錯誤

6.3.3. on delete cascade

6.3.4. on delete set null

6.3.5. on update restrict

6.3.6. on update cascade

6.3.6.1. on update cascade,使伺服器將父表(address或store)主鍵值的改動傳播到子表(customer)

6.3.7. on update set null

6.4. 唯一約束

6.4.1. 限制一列或多列的值,保證其在數據表中的唯一性

6.5. 檢查約束

6.5.1. 限制列的可用值範圍

6.6. sql

ALTER TABLE customer
ADD CONSTRAINT fk_customer_address FOREIGN KEY (address_id)
REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE;
ALTER TABLE customer
ADD CONSTRAINT fk_customer_store FOREIGN KEY (store_id)
REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE;

6.7. 如果想刪除主鍵約束或外鍵約束,也可以使用alter table語句,只不過要將add改為drop


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ##### 常用基本配置項 ```xml net35; net40; net45; net451; net452; net46; net461; net462; net47; net471; net472; net48; netstandard2.0; netstandard2.1; netcore ...
  • ## 前言 在抽象工廠模式開篇之前,我們先思考一個問題,如果我們要設計一套房子,其他的組件暫時不考慮,我們僅僅考慮房頂、地板、窗戶、房門進行設計。什麼樣的風格暫時未知,可能會有很多種類。可以先設計一套古典風格的房子,再設計一套現代風格的房子,再設計一套歐式風格的房子....這麼多套房子需要設計,需求 ...
  • 原文鏈接:https://www.cnblogs.com/ysmc/p/17663663.html 最近技術交流群里,還有不少小伙伴不知道 FromRoute、FromQuery、FromBody 這幾個特性是怎麼使用的,也不清楚它們之間的區別在哪裡,特意寫下這個文章,希望可以幫助到迷茫的小伙伴。 ...
  • [toc] # Linux運維工程師面試題(5) > 祝各位小伙伴們早日找到自己心儀的工作。 > 持續學習才不會被淘汰。 > 地球不爆炸,我們不放假。 > 機會總是留給有有準備的人的。 > 加油,打工人! ## 1 SELECT 語句處理的順序 查詢執行路徑中的組件:查詢緩存、解析器、預處理器、優化 ...
  • 海康平臺安裝部署環境需要基於HikvisionOS Linux系統(簡稱HIKOS),是基於CentOS 7的 Linux操作系統。 HIKOS系統安裝完成後,即設置了root和hik兩個用戶,初始登錄密碼為123456。 其中root是超級管理員用戶,只能通過本地終端登錄系統,禁止使用遠程終端登錄 ...
  • # QEMU直接從tap/tun取數據 **QEMU tap數據接收步驟:** 1. qemu從tun取數據包 2. qemu將數據包放入virtio硬體網卡。 3. qemu觸發中斷。 4. 虛擬機收到中斷,從virtio讀取數據。 **在qemu中步驟1(tap_read_packet)和步驟2 ...
  • Proxmox VE 是一個運行虛擬機和容器的平臺。 這是 基於 Debian Linux,完全開源。 最大 靈活性,我們實施了兩種虛擬化技術 - 基於內核的虛擬機 (KVM) 和基於容器的虛擬化 (LXC)。 Proxmox VE是一個企業級虛擬化平臺,該平臺集成了基於內核的虛擬機管理程式(KVM ...
  • 本文探討了進程調度的原理和演算法,並提供了全面的概述。進程調度是操作系統中的重要組成部分,用於決定進程的執行順序和分配CPU時間。我們討論了優先順序調度和時間片輪轉調度演算法。優先順序調度根據進程的優先順序確定執行順序,可以分為搶占式和非搶占式。時間片輪轉調度將CPU時間劃分為固定大小的時間片,每個進程在一個... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...