資料庫索引及優化

2021-09-25 09:25:18 字數 3544 閱讀 5126

資料庫索引

一、索引的概念

索引是一種排好序的快速查詢的資料結構

索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上

我們平常所說的索引,如果沒有特別指明,都是指b樹(多路搜尋樹,並不一定是二叉的)結構組織的索引。其中聚集索引、次要索引、覆蓋索引、復合索引、字首索引、唯一索引 預設都是使用b+樹索引,統稱為 索引。當然除了 b+樹 這種型別的索引之外,還有雜湊索引(hash index)等。

二、索引的優缺點

優點:1)提高資料檢索的效率,降低資料庫的io成本

2)通過索引列對資料進行排序,降低資料排序的成本,降低了cpu的消耗

缺點:1)索引其實也是一張表,該錶儲存了主鍵與索引字段,並指向實體表的記錄,所以索引也是要占用空間

2)索引雖然提高了查詢速度,但是卻降低了更新表的速度。因為更新表時,mysql不僅要儲存資料,還要儲存索引檔案。每次更新新增了索引列的字段。都會調整因為更新所帶來的的鍵值變化後的索引資訊。

三、explain

1.概念

用法:explain + sql 檢視執行計畫包含的資訊

例如:

explain select * from admin;

1)檢視表的讀取順序

2)資料讀取操作的操作型別

3)哪些索引可以使用

4)哪些索引被實際使用

5)表之間的引用

6)每張表有多少行被優化器查詢

2.各欄位解釋

1)id

id相同,執行順序由上至下

id不同,id值越大越早執行

2)select_type

****** -----------------------普通查詢,查詢中不包含子查詢或者union

primary-----------------------查詢中包含任何複雜的子部分,最外層查詢被標記為primary

subquery---------------------查詢中包含任何複雜的子部分,內層查詢被標記為subquery

derived-----------------------在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴執行這些子查詢,把結果放在臨時表中

union--------------------------若第二個select出現在union之後,則被標記為union;若union包含在from子句的子查詢中,外層select將被標記為derived

union result------------------從union表獲取結果的select

3)type

從最好到最差的排序為:

system --> const --> eq_ref --> ref --> range --> index --> all

一般來說,得保證查詢至少達到range級別,最好能達到ref

1.system :

表只有一行記錄(等於系統表),這是const型別的特例,平時不會出現,這個也可以忽略不計

2.const:

表示通過索引一次就找到了,const用於比較 primary key 或者 unique 索引。因為只匹配一行資料,所以很快。

唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄。

4.ref

非唯一性索引掃瞄,返回匹配某個單獨值的所有行。

5.range

只檢索給定範圍的行,使用乙個索引來選擇行。一般在 between 、< 、> 、in 等的查詢

6.index

full index scan,index與all的區別為 index型別只遍歷 索引樹。通常比all快,因為索引檔案通常比資料檔案小。

全表掃瞄

顯示可能應用在這張表中的索引,乙個或多個。查詢涉及到的字段上若涉及索引,則該索引將被列出,但不一定被查詢實際使用

key實際使用的索引。如果為null,則沒有使用索引

四、索引失效的原因

1)在索引列上做操作(計算、函式、型別轉換),會導致索引失效而轉向全表掃瞄

2)使用 != 或者 <> 的時候會失效

3)is null /is not null 會失效

4)like 以萬用字元 『%abc…』 會失效(若使用右模糊查詢(『abd…%』),則可以使用索引)

注:使用覆蓋索引可以使用 %abc…%

5)字串不加單引號會失效

6)用 or 連線 會失效

7)復合索引,左側的不能斷

注:索引兩大功能:檢索(select) 和排序(order by)

group by 基本上都需要進行排序,會有臨時表產生

索引檢索(where 之後,order by之前的條件)優化口訣:

索引排序(order by 之後)優化:

1)order by時 ,不要使用 **select ***

2)嘗試提高 sort_buffer_size 的大小

每次讀取到 sort_buffer 的記憶體資料容量大小

3)合理設定 max_length_for_sort_data 的大小

日誌分析工具 mysqldumpslow :

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...

資料庫索引的原理及優化

在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。b 樹...

資料庫優化 索引

鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...