資料庫索引效能提公升

2021-10-10 01:33:45 字數 2496 閱讀 2095

乙個索引是儲存的表中乙個特定列的值資料結構(最常見的是b-tree)。索引是在表的列上建立。所以,要記住的關鍵點是索引包含乙個表中列的值,並且這些值儲存在乙個資料結構中。請記住記住這一點:索引是一種資料結構 。

b-tree 是最常用的用於索引的資料結構。因為它們是時間複雜度低, 查詢、刪除、插入操作都可以可以在對數時間內完成。另外乙個重要原因儲存在b-tree 中的資料是有序的。資料庫管理系統(rdbms)通常決定索引應該用哪些資料結構。但是,在某些情況下,在建立索引時可以指定索引要使用的資料結構。

雜湊表是另外一種你可能看到用作索引的資料結構,這些索引通常被稱為雜湊索引。使用雜湊索引的原因是,在尋找值時雜湊表效率極高。所以,如果使用雜湊索引,對於比較字串是否相等的查詢能夠極快的檢索出的值。例如查詢(select * from employee where employee_name = 『jesus』) 就可以受益於建立在employee_name列上的雜湊索引。哈系索引的工作方式是將列的值作為索引的鍵值(key),和鍵值相對應實際的值(value)是指向該表中相應行的指標。因為雜湊表基本上可以看作是關聯陣列,乙個典型的資料項就像「jesus => 0x28939″,而0x28939 是對記憶體中表中包含jesus 這一行的引用。在哈系索引的中查詢乙個像「jesus」這樣的值,並得到對應行的在記憶體中的引用,明顯要比掃瞄全表獲得值為「jesus」的行的方式快很多。

雜湊表是無順的資料結構,對於很多態別的查詢語句雜湊索引都無能為力。舉例來說,假如你想要找出所有小於40 歲的員工。你怎麼使用使用雜湊索引進行查詢?這不可行,因為雜湊表只適合查詢鍵值對-也就是說查詢相等的查詢(例:like 「where name = 『jesus』)。雜湊表的鍵值對映也暗示其鍵的儲存是無序的。這就是為什麼雜湊索引通常不是資料庫索引的預設資料結構-因為在作為索引的資料結構時,其不像b-tree 那麼靈活。

因為索引基本上是用來儲存列值的資料結構,這使查詢這些列值更加快速。如果索引使用最常用的資料結構-b-tree-那麼其中的資料是有序的。有序的列值可以極大的提公升效能。

原因示例

假設我們在 employee_name 這一列上建立乙個b-tree 索引。這意味著當我們用之前的sql查詢姓名是『jesus』的雇員時,不需要再掃瞄全表。而是用索引查詢去查詢名字為『jesus』的雇員,因為索引已經按照按字母順序排序。索引已經排序意味著查詢乙個名字會快很多,因為名字少字母為『j』的員工都是排列在一起的。另外重要的一點是,索引同時儲存了表中相應行的指標以獲取其他列的資料。

資料庫索引是建立在表的某列上的,並且儲存了這一列的所有值。但是,資料庫索引並不儲存這個表中其他列(字段)的值。舉例來說,如果在employee_name 列建立索引,那麼列employee_age 和employee_address 上的值並不會儲存在這個索引當中。如果確實把其他所有欄位也儲存在個這個索引中,那就成了拷貝一整張表做為索引,這樣會占用太大的空間而且會十分低效。

索引儲存了指向表中某一行的指標

資料庫索引同時儲存了指向表中的相應行的指標。指標是指一塊記憶體區域, 該記憶體區域記錄的是對硬碟上記錄的相應行的資料的引用。因此,索引中除了儲存列的值,還儲存著乙個指向在行資料的索引。也就是說,索引中的employee_name 這列的某個值(或者節點)可以描述為 (「jesus」, 0x82829), 0x82829 就是包含 「jesus」那行資料在硬碟上的位址。如果沒有這個引用,就只能訪問到乙個單獨的值(「jesus」),而這樣沒有意義,因為不能獲取這一行記錄的employee 的其他值-例如位址(address)和年齡(age)。

當這個sql (select * from employee where employee_name = 『jesus』 )執行時,資料庫會檢查在查詢的列上是否有索引。假設employee_name 列上確實建立了索引,資料庫會接著檢查使用這個索引做查詢是否合理 - 因為有些場景下,使用索引比起全表掃瞄會更加低效。

通常來說, 不會告訴資料庫什麼時候使用索引,資料庫自己決定。然而,值得注意的是在大多數資料庫中(像oracle 和 mysql), 實際上可以制訂想要使用的索引。

在employee_name 列上建立索引的sql 如下:

create

index name_index

on employee (employee_name)

在雇員表上建立兩個列的聯合索引的sql 如下:

create

index name_index

on employee (employee_name, employee_age)

乙個非常好的模擬是把資料庫索引看作是書的索引。如果有一本關於狗的書,想要找關於『**獵犬』的那部分。當可以通過在書背的索引找到哪幾頁有關於『**獵犬』資訊的時候,為什麼要翻完正本書 - 這相當於資料庫中的全表掃瞄。同樣的,就像一本書的索引包含頁碼一樣,資料庫的索引包含了指標,指向在sql 中想要查詢的值所在的行。

記住:建立在某列(或多列)索引需要儲存該列最新的資料。

基本原則是只如果表中某列在查詢過程中使用的非常頻繁,那就在該列上建立索引。

提公升資料庫查詢的效能

資料庫查詢效能的提公升也是涉及到開發中的各個階段,在開發中選用正確的查詢方法無疑是最基礎也最簡單的。14.3.3.1 sql語句的優化 使用正確的sql語句可以在很大程度上提高系統的查詢效能。獲得同樣資料而採用不同方式的sql語句在效能上的差距可能是十分巨大的。由於hibernate是對jdbc的封...

提公升資料庫查詢的效能

資料庫查詢效能的提公升也是涉及到開發中的各個階段,在開發中選用正確的查詢方法無疑是最基礎也最簡單的。1 sql語句的優化 使用正確的sql語句可以在很大程度上提高系統的查詢效能。獲得同樣資料而採用不同方式的sql語句在效能上的差距可能是十分巨大的。由於hibernate是對jdbc的封裝,sql語句...

資料庫效能問題 索引

一 現象 tps很低,響應時間很長,資料庫伺服器cpu很高 接近100 應用伺服器負載比較低 二 開啟慢查詢配置 1 在mysql配置檔案 etc my.cnf中增加 slow query log 1 long query time 0.1 slow query log 這是乙個布林型變數,預設為真...