【云駐共創】深入理解GaussDB(for MySQL)數據庫中的文件組織與索引
摘要:GaussDB(for MySQL)是華為自研的最新一代高性能企業級分布式關系型數據庫,完全兼容MySQL。文件組織與索引方式作為數據庫性能重要指標,本文從其基本概念入手,講述文件組織與索引的一般概念,進而分析并展示其在GaussDB(for MySQL)中的應用。

1. 文件組織
在了解數據以文件的形式存儲之前,我們有必要先了解什么是文件組織。文件組織就是當文件存儲在磁盤上時,組織文件中的記錄所使用的方法,其組織的方式和方法制約著數據的存儲與訪問效率。我們知道數據庫是將數據存儲在外部存儲器中的,計算時需要將數據加載到內存后處理,不同的DBMS在讀取方式上也是幾乎迥異。所以每一個文件組織都會為某些操作的效率提高而想盡方法,但同時也消耗其他操作的性能。通過訪問層代碼,可以創建、刪除文件,向其中插入或者刪除記錄。還可以進行查詢操作,以一次訪問一個記錄的方式來遍歷文件上的所有記錄。文件層將文件中的記錄存儲于一組磁盤頁,并且跟蹤分配給每一個文件的所有頁以及頁的可用空間。
無序文件是最簡單的文件組織方式,也就是說文件的數據在文件頁中以任意的順序排列,每一個記錄有一個唯一標識符,rID,訪問者可通過rID檢索到某一條特定的記錄。該種文件組織方法要求文件管理器必須跟蹤分配給文件的所有頁面,處理數據時將數據讀入內存,而同時為了持久存儲,還需要將數據寫回磁盤,上述操作都是由稱為緩沖區管理器的軟件層實現的。當文件層需要處理某一頁數據時,向緩沖區管理器取出該頁,并指定rID,而如果所請求的頁面不在內存中,則將數據從磁盤讀入內存。磁盤上的空間是由磁盤空間管理器負責的,當文件層需要額外磁盤空間保存新記錄時,它就會請求磁盤空間管理器分配一個新的頁面以保存數據。當文件不再需要該磁盤頁時,他也會通過磁盤空間管理器釋放該空間。
2. 什么是索引
索引是一種為了提高數據檢索性能而采用的技術,在磁盤上組織數據記錄的一種數據結構,以優化某類數據檢索的操作。其具有如下特點:
● 索引時在保重的字段基礎上建立的一種數據庫對象,由數據庫管理員或表的擁有者負責創建和撤銷,而其他用戶不能隨意創建和撤銷。
● 索引的創建和撤銷對表本身不產生任何影響。
● 索引由系統自動選擇和維護。
我們知道在一般情況下,表中記錄的順序是由數據的輸入順序來決定的,并由記錄號標識,除非有記錄的插入或刪除,否則其順序總是保持不變的。如果創建了一個索引(非聚簇索引),便建立一個專門存放索引項的結構,該結構中保存索引項的邏輯順序,并且記錄指針指向的物理記錄。此時,表的存儲部分便由兩個部分組成,一部分用于存儲表的數據頁面,另一部分則是用于存放索引頁面。
索引頁面相對于數據頁面是小得多的,在數據查詢時,首先搜索索引頁面,從中找到所需數據的指針,然后再通過該指針在數據頁面找到讀取的數據。很明顯,當數據表規模較為龐大時,如果我們為該表建立了索引,那么我們就可以通過高效的查找算法找到該索引項,進而通過指針快速找到需要查找的數據,索引在很大程度上提高數據庫的查詢性能。
3. 索引的創建原則
缺少索引或者對索引創建不合理,都會對數據庫性能產生影響。創建索引具有如下原則和方法:
● 創建索引由專人完成。專人指的是數據庫管理員或表的管理者,專人根據應用環境的需要在數據庫中建立一個或多個索引,其他用戶是無權創建和撤銷索引的。
● 創建索引要取決于表的數據量。一般來收,基本表中記錄的數據量越多,數據量越長,我們是越有必要建立索引的。同時,對于查詢的頻率高,實時性強的表,我們也是要建立索引的。
● 索引數量要適度。索引文件本身會占用文件目錄和存儲空間。索引過多會加重系統負擔,索引本身也需要維護,當基本表的數據進行調整時,也要對索引進行調整和更新,從而保證和基本表一致,所以如果索引過多,也會影像數據增刪改的速度。
3.1. 哪些情況下應該避免使用索引
● 包含太多重復值的字段
● 查詢中很少被引用的字段
● 值特別長的字段
● 查詢返回率特別高的字段
● 具有很多空值的字段
● 需要經常插、刪、改的字段
● 記錄較少的基本表
● 需要進行頻繁、大批量數據更新的基本表
4. 索引的類型與創建方法
索引的類型根據數據庫的功能決定,由DBA或表的擁有者負責創建和撤銷。通常索引分為聚簇索引、非聚簇索引、普通索引以及唯一索引四種類型。普通索引是GaussDB(for MySQL)的基本索引類型,允許在定義索引的列中插入重復值和空值。而唯一索引的列值必須是唯一的,但允許有空值,如果是組合索引,則列值的組合必須唯一,一個表是可以建立多個唯一索引的;主索引是一種特殊的唯一索引,一個表知能有一個主索引,而不允許有空值。
4.1. 三種在GaussDB(for MySQL)中創建普通索引的方法
直接創建普通索引
CREATE INDEX index_name ON table(column_name)
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
修改表結構同時創建普通索引
ALTER TABLE table_name ADD INDEX index_name(column_name)
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
創建表同時創建普通索引
CREATE TABLE
PRIMARY_KEY(column_name),
INDEX index_name(column_name);
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
4.2. 在GaussDB(for MySQL)中創建唯一索引
而唯一索引的創建方式與普通索引的創建方式是類似的,只需要在INDEX前加上UNIQUE參數即可。而需要注意的是,唯一索引要求索引列的取值是唯一的,具體如下圖所示:
根據索引的列數,我們還可以將索引分為單列索引和組合索引。具體如下圖所示:
創建組合索引
CREATE INDEX index_name ON table(column_name1, column_name2)
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
5. 如何在GaussDB(for MySQL)查看與刪除索引
查看索引基本命令:
SHOW INDEX FROM [database_name].table_name
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
索引與數據庫對象不同,它可以根據需要隨時創建,也可以將不需要的索引進行刪除,從而減少資源的占有量。刪除索引有兩種方式,基本方式為:
DROP INDEX index_name on table_name
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
還可以修改表結構時刪除索引:
ALTER TABLE table_name DROP INDEX index_name
具體來說,在GaussDB(for MySQL)管理控制臺的操作如下:
6. 總結
本文分析了數據庫系統中文件組織與索引的一般概念,并介紹了GaussDB(for MySQL)數據庫的索引類型及其創建、刪除、查詢等方法。由于GaussDB對MySQL語法的兼容特性,極大降低了用戶的學習成本,做到輕松上手。通過本文,更加深入了解GaussDB(for MySQL)的索引使用機制,相信通過本文,用戶可更快更高效地在工作中使用GaussDB(for MySQL)的索引。
7. 參考資料
本文整理自華為云社區【內容共創】活動第15期。
https://bbs.huaweicloud.com/blogs/345822
任務23:華為云數據庫之文件組織與索引
GaussDB數據庫 MySQL 上云必讀 云數據庫 GaussDB(for MySQL) 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。