mysql資料庫物件索引 MySQL資料庫索引詳解

2021-10-17 12:36:42 字數 3922 閱讀 5090

一、什麼是索引:

索引是乙個排序的列表,在這個列表中儲存著索引值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢速度,這是因為使用索引後可以不用全表掃瞄來定位某行的資料,而是先通過索引表找到該行資料對應的實體地址然後訪問相應的資料。

索引通過不斷縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機事件變成順序事件,也就是說,有個這個機制我們可以總是用同一種查詢方式來鎖定資料;

索引實際就是一張表,該錶儲存了主鍵和索引字段,並指向實體表的記錄,所以索引也是佔了一大部分空間,不可能儲存在記憶體中,因此索引往往都是以檔案形式儲存在我們的硬碟上。

在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢的速度,這是因為使用索引後可以不用掃瞄全表來定位某行的資料,而是先通過索引表找到該行資料對應的實體地址然後訪問相應的資料。

索引通過不斷地縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機事件變成順序事件,也就是說,有個這個機制我們可以總是用同一種查詢方式來鎖定資料;

索引實際就是一張表,該錶儲存了主鍵和索引字段,並指向實體表的記錄,所以索引也是佔了一大部分空間,不可能儲存在記憶體中,因此索引往往都是以檔案形式儲存在硬碟上。

二、索引的分類:

常見索引有主鍵索引、唯一索引、普通索引、全文索引和組合索引。

1、主鍵索引

主索引,根據pk_clolum(length)建立索引,不允許重複,不允許空值;

alter table 'table_name' add primary key pk_index('col');

2、唯一索引

用來建立索引的列的值必須是唯一的,允許空值;

alter table 『table_name' add unique index_name('col');

3、普通索引

用表中的普通列構建的索引,沒有任何限制;

alter table 'table_name' add index index_name('col');

4、全文索引

用大文字物件的列構建的索引;

alter table 'table_name' add indexd index_name('col');

5、組合索引

用多個列組合構建的索引,這多個列中的值不允許有空值;

alter table 'table_name' add index index_name('col');

三、sql查詢計畫詳解:

我們可以在select語句前新增explain來查詢mysql的執行計畫,下面是對explain的具體說明:

idselect識別符。這是select的查詢序列號

select_type

查詢型別

******:簡單的select(不使用union或子查詢)

primary:最外面的select

union:union中第二個或後面的select語句

depedent union:union中第二個或後面的select語句,取決於外面的查詢

union result:union的結果

subquery:子查詢中的第乙個select

dependent subquery:子查詢中的第乙個select,取決於外面的查詢

derived:匯出表的select(from字句的子查詢)

table

輸出行所引用的表

type

聯接型別

system:表僅有一行(=系統表)

const:表最多有乙個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優化器剩餘部分認為是常數。const表很快,因為它們只讀取一次

eq_ref:對於每個來自前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別

ref:對於每個來自前面的表的行組合,所有有匹配索引值的行將從這張表中讀取

ref_or_null:該聯接型別同ref,但是新增了mysql可以專門搜尋包含null值的行

index_merge:該聯接型別表示使用了索引合併優化方法

unique_subquery:該型別替換了下面形式的in子查詢的ref:value in (select primary_key from single_table where some_expr)unique_subquery是乙個索引查詢函式,可以完全替換子查詢,效率更高

index_subquery:該聯接型別類似於unique_subquery。可以替換in子查詢,但只適合下列形式的子查詢中的非唯一索引:value in (select key_column from single_table where some_expr)

rang:只檢索指定範圍的行,使用乙個索引來選擇行

index:該聯接型別與all相同,除了只有索引樹被掃瞄。這通常比all快,因為索引檔案通常比資料檔案小

all:對於每個來自先前的表的行組合,進行完整的表掃瞄

possible_keys

指出mysql能使用哪個索引在該表中找到行

key顯示mysql實際使用的鍵(索引)。如果沒有選擇索引,鍵是null

key_len

顯示mysql決定使用的鍵長度。如果沒有選擇索引,則長度為null

ref顯示使用哪個列或常數與key一起從表中選擇行

rows

顯示mysql認為它執行查詢時必須檢查的行數。多行之間的資料相乘可以估算要處理的行數

filtered

顯示了通過條件過濾出的行數的百分比估計值

extra

mysql解決查詢的詳細資訊

range checked for each record(index map:#):mysql沒有發現好的可以使用的索引,但發現如果來自前面的表的列值已知,可能部分索引可以使用

using filesort:mysql需要額外的一次傳遞,以找出如何按排序順序檢索行

using index:從只使用索引樹中的資訊而不需要進一步索引讀取實際的行來檢索表中的列資訊

using temporary:為了解決查詢,mysql需要建立乙個臨時表來容納結果

using sort_union(...),using union(...),using intersect(...):這些函式說明如何為index_merge聯接型別合併索引掃瞄

using index for group-by:類似於訪問表的using index方式,using index for group-by表示mysql發現了乙個索引,可以用來查詢group by 或distinct查詢的所有列,而不要額外索引硬碟訪問實際的表

type顯示的是訪問型別,是較為重要的乙個指標,其中結果值從好到壞依次是:system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all

一般我們在查詢的時候至少保證到range級別,最後達到ref。

四、索引失效

1、前導模糊查詢不能利用索引(like '%***' 或like '%***%')

2、使用or連線

3、使用不等號(!= 或者<>)

4、空值判斷(is null 或者is not null)

5、varchar型別在條件查詢時未加引號,導致隱式轉換

6、查詢所有(select *)

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

8、使用not in 或者not exists

9、如果是左外連線或右外連線查詢時,兩張表的關聯字段編碼格式不一樣

10、如果聯合索引key 'name_index' ('name','code') using btree沒有用到第乙個索引字段,則不會走索引

11、使用between and

12、當變數是times型別,而字段是date型別,索引失效;或相反情況也一樣失效

13、時間型別和varchar型別的索引比較

mysql資料庫物件索引 Mysql資料庫索引

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

MySQL資料庫物件 索引

1.概述 2.索引分類 2.1 不同索引的概念 2.1.1 普通索引 2.1.2 唯一索引 2.1.3 全文索引 2.1.4 多列索引 3.索引操作 3.1 普通索引 3.1.1 建立表時建立普通索引 3.1.2 在已經存在的表上建立普通索引 3.1.3 通過sql語句alter table建立普通...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...