1. 程式人生 > >IT修煉手冊之SQL索引

IT修煉手冊之SQL索引

索引基礎概念介紹:

索引(index)翻譯為一個目錄,用於快速定位我們想要找的資料的位置。例如:我們把一個數據庫比作一本書,而索引(index)就是書中的目錄,此刻要找到書的某個感興趣的內容,我們一般是不會整本書翻完再去確認該內容在哪裡,而是通過書的目錄,定位到該內容章節所在頁數,最後直接翻到該頁面

資料庫中的索引

全表掃描 VS 索引掃描:
(1)、以一本書為例,全表掃描就是如果我們查詢某個內容的時候,那麼通讀一遍新華字典,然後找到我們想要找到的字.

(2)、而跟全表掃描相對應的就是索引查詢,索引查詢就是在表的索引部分找到我們想要找的資料具體位置,然後會到表裡面將我們想要找的資料全部查出

索引的主要作用:
(1)、用來解決查詢速度比較慢的問題的。通過索引可以提高查詢速度。他的作用和更改資料沒有任何關係
(2)、是對欄位來加的,不是對錶
(3)、索引欄位的資料變化時(新增、更新、刪除)B 樹的結構可能會發生變化。
我們對索引欄位的 insert/update/delete 操作時效率上與沒有索引的情況比較會比較低
(4)、索引會使你的表的大小變大,因為要儲存索引結構.

索引實現原理:
B樹(Mysql採用B+Tree的形式進行實現):
B-tree又叫平衡多路查詢樹。一棵m階的B-tree (m叉樹)的特性如下:
(其中ceil(x)是一個取上限的函式)

1) 樹中每個結點至多有m個孩子;

2) 除根結點和葉子結點外,其它每個結點至少有有ceil(m / 2)個孩子;

3) 若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節點);

4) 所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字資訊(可以看做是外部結點或查詢失敗的結點,實際上這些結點不存在,指向這些結點的指標都為null);

5) 每個非終端結點中包含有n個關鍵字資訊: (n,P0,K1,P1,K2,P2,……,Kn,Pn)。其中:

a) Ki (i=1…n)為關鍵字,且關鍵字按順序排序K(i-1)< Ki。

b) Pi為指向子樹根的接點,且指標P(i-1)指向子樹種所有結點的關鍵字均小於Ki,但都大於K(i-1)。

c) 關鍵字的個數n必須滿足: ceil(m / 2)-1 <= n <= m-1。

B-tree中的每個結點根據實際情況可以包含大量的關鍵字資訊和分支(當然是不能超過磁碟塊的大小,根據磁碟驅動(disk drives)的不同,一般塊的大小在1k~4k左右);這樣樹的深度降低了,這就意味著查詢一個元素只要很少結點從外存磁碟中讀入記憶體,很快訪問到要查詢的資料。
這裡寫圖片描述

索引型別
(1)主鍵索引
其實就是主鍵,我們對錶的欄位指定好主鍵之後,自動的會給我們建立一個主鍵索引
(2)普通索引
就是我們指定一個欄位,讓這個欄位成為索引欄位。
(3)唯一索引
1、你這個列一定是全域性唯一的,不能重複
2、欄位可以為 NULL,並且可以有多個 NULL 資料,但是如果有內容必須滿足第一個約束
3、主鍵索引只能是主鍵才可以成為主鍵索引,唯一索引普通欄位也可以成為唯一索引, 只要是滿足上面的條件就可以
組合索引(複合索引)
1、多個欄位可以組成一個索引
2、這種索引結構主要是用在 where 後面條件比較多的情況

(4)覆蓋索引
不是索引型別,是 SQL 寫法,讓你的 SQL 儘量用覆蓋索引,也就是說我們的 SQL 查詢的欄位儘量要用索引欄位
對於 Select 來講的。select 欄位 1,欄位 2,欄位 3 from table where ===

欄位 1,欄位 2,欄位 3 最好是索引欄位
如果是主鍵索引的話,在葉子節點上儲存的是具體的資料行。

如果索引欄位不是主鍵索引,那麼葉子節點上儲存的不是資料行。儲存的是主鍵值。 那麼他拿到主鍵值之後再去找資料行。我們把這個操作稱之為回行操作

如果我們操作不當,即使你建立了索引,在查詢的時候也不會被用到,進而你的 SQL 效率同樣會很低。 操作不當具體是指我們的 where 寫的不恰當,會導致索引時效
重點內容
全值匹配我最愛,最左字首要遵守;
帶頭大哥不能死,中間兄弟不能斷。(指代覆蓋索引的情況)
索引列上少計算,範圍之後全時效。
LIKE 百分寫最右,覆蓋索引不寫星。
不等空值還有 or ,索引失效要少用。
var 引號不可丟, SQL 高階也不難

如下圖示供參考:

這裡寫圖片描述

檔案資料
innoDB
.frm 表結構
.idb 表資料 和 索引資料的
.opt 字符集 排序的規則
myisam
.frm 表結構
.MYD 表資料
.MYI 表索引的
索引的優點
1、提高查詢速度
2、提高排序速度
缺點:
1、佔用空間 10M=》20M
2、增加、更新、刪除操作比較慢
以上內容僅供學習參考如有補充歡迎留言