天天看點

Mysql 的幾種索引總結1、Mysql 的幾種索引總結2、索引分析

Mysql 的幾種索引總結

  • 1、Mysql 的幾種索引總結
    • 1.1、普通索引
    • 1.2、唯一索引
    • 1.3、組合索引
      • 1.3.1、起作用索引
      • 1.3.1、不起作用索引
    • 1.4、全文索引
    • 1.5、空間索引
  • 2、索引分析
    • 2.1、索引優劣勢
    • 2.2、索引語句分析
      • 2.2.1、删除索引
      • 2.2.2、檢視索引
      • 2.2.3、SHOW INDEX 語句說明
      • 2.2.3、EXPLAIN 語句說明
    • 2.3、索引失效

1、Mysql 的幾種索引總結

1.1、普通索引

普通索引是最基本的索引類型,沒有唯一性之類的限制,其作用隻是加快對資料的通路速度,索引值可出現多次。。

  • 建立普通索引腳本
/**
 * 1、新增時建立索引
 */ 
CREATE INDEX indexName ON table_name (column_name);

/**
 * 2、建立表以後,添加索引,修改表結構(添加索引)
 */ 
ALTER table tableName ADD INDEX indexName(columnName);

           

1.2、唯一索引

唯一索引與普通索引類似,兩者不同點在于:唯一索引的索引列的值必須唯一(除了NULL外,NULL可能會出現多次),但允許有空值。如果是組合索引,則列值的組合必須唯一。需要特别說明的是,主鍵也是一種唯一索引,但它必須指定為“PRIMARY KEY”。

建立索引的主要原因是減少查詢索引列操作的執行時間,尤其是對比較龐大的資料表。
  • 建立唯一索引腳本
/**
 * 1、新增時建立索引.這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
 *    關于 length : 如果是CHAR,VARCHAR類型,length可以小于字段實際長度;如果是BLOB和TEXT類型,必須指定 length。
 */
CREATE UNIQUE INDEX indexName ON mytable(columnName(length)) ;

/**
 * 2、建立表以後,添加索引.這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
 */
ALTER table mytable ADD UNIQUE [indexName] (columnName(length));

/**
 * 3、主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。
 *   該語句添加一個主鍵,這意味着索引值必須是唯一的,且不能為NULL。
 */
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 

           

1.3、組合索引

組合索引是在多個字段上建立一個索引。

       組合索引是針對單列索引的一種劃分。單列索引是在資料表中的某一個字段上建立的索引,一個表中可以建立多個單列索引。
  • 組合索引可起幾個索引的作用,但是使用時并不是随便查詢哪個字段都可以使用索引,而是遵循“最左字首”:利用索引中最左邊的列集來比對行,這樣的列集稱為最左字首。

  • 例如:這裡由id、name 和 age 3 個字段構成的索引,索引行中按 id/name/age 的順序存放,索引可以搜尋下面字段組合:(id、name、age)、(id、name) 或者 id.如果列不構成索引最左字首原則,Mysql不能使用局部索引,如(age)或者(name、age)組合則不能使用索引查詢。

  • 建立組合索引腳本
ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);  

           

1.3.1、起作用索引

圖解 :

Mysql 的幾種索引總結1、Mysql 的幾種索引總結2、索引分析

1.3.1、不起作用索引

圖解 :

Mysql 的幾種索引總結1、Mysql 的幾種索引總結2、索引分析

1.4、全文索引

FULLTEXT 全文索引可以用于全文搜尋。隻有 MyISAM 存儲引擎支援 FULLTEXT 索引,并且隻為 CHAR 、VARCHAR 和 TEXT 列。索引總是對整個列進行,不支援局部(字首)索引。

  • 建立全文索引腳本
/*
 * 建立全文索引腳本,該語句指定了索引為 FULLTEXT ,用于全文索引。
 */
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);

           

1.5、空間索引

空間索引必須在 MyISAM類型的表中建立,且空間類型的字段必須為非空。

2、索引分析

2.1、索引優劣勢

        過多的使用索引将會造成濫用。是以索引也會有它的缺點:

雖然索引大大提高了查詢速度,同時卻會降低更新表的速度

,如對表進行INSERT、UPDATE和DELETE。

因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。

        同時,

建立索引會占用磁盤空間的索引檔案。

2.2、索引語句分析

2.2.1、删除索引

  • 删除索引腳本
/**
 * 删除索引,第一種文法
 */
ALTER TABLE table_name DROP INDEX index_name;

/** 
 * 删除索引,第二種文法
 */
DROP INDEX index_name ON table_name;


           

說明:添加 AUTO_INCREMENT 限制字段的唯一索引不能被删除。删除表中的列時,如果要删除的列為索引的組成部分,則該列也會從索引中删除。如果組成索引的所有列都被删除,則整個索引将被删除。

2.2.2、檢視索引

  • 檢視索引腳本
/**
 * 查詢表索引文法
 */
SHOW INDEX FROM table_name;   

/**
 * 例:查詢 exp 表的索引
 */ 
SHOW index from exp;   

           

2.2.3、SHOW INDEX 語句說明

Mysql 的幾種索引總結1、Mysql 的幾種索引總結2、索引分析
關鍵字 關鍵字說明
Table 表示建立索引的表
Non_unique 表示索引非唯一,1-代表是非唯一索引,0-代表唯一索引
Key_name 表示索引的名稱
Seq_in_index 表示該字段在索引中的位置,單列索引該值為1,組合索引為每個字段在索引定義中的順序。
Column_name 表示定義索引的列字段
Sub_part 表示索引的長度
Null 表示該字段是否能為空值
Index_type 表示索引類型

2.2.3、EXPLAIN 語句說明

        EXPLAIN 語句用于分析查詢的SQL語句的執行,看一條查詢的SQL語句是怎麼去執行的,有沒有用到索引,需不需要回表查詢,需不需要額外排序的情況,然後我們針對SQL語句執行來進行一些特定語句。

Mysql 的幾種索引總結1、Mysql 的幾種索引總結2、索引分析
關鍵字 關鍵字說明 備注
id

id 指執行的優先級,id越大優先級越大;值相同的時候,從上往下,依次執行。

-
select_type select_type 行指定所使用的 SELECT 查詢類型,這裡值為 SIMPLE 表示簡單的 SELECT,不使用 UNION 或子查詢。其他可能的取值有:PRIMARY、UNION、SUBQUERY 等。 SIMPLE(

表示簡單查詢,其中不包括連接配接查詢和子查詢

)、PRIMARY(

表示主查詢,或者是最外層的查詢語句

)、UNION(

表示連接配接查詢的第二個或後面的查詢語句

table table 行指定資料庫讀取的資料表的名字,它們按被讀取的先後順序排列。 -
type type 行指定了本資料表與其他資料表之間的關聯關系,從好到壞依次是:system,const,eq_ref,ref,range,index,all. system(

表中隻有一條資料,引擎隻能使MYISAM和MEMORY

)、const(

使用唯一索引或者主鍵,用where限制條件後傳回一條資料,有且隻有一條

)、eq_ref(

唯一性索引,對每個索引的查詢隻能傳回比對的唯一一條資料

)、ref(

非唯一性索引,對每個索引傳回比對的所有

)、range(

索引指定範圍的行,where後邊是範圍

)、index(

查詢索引的全部資料

) 和 all (

查詢所有資料

possible_keys

possible_keys 行給出了 Mysql 在搜尋資料記錄時,可選用的各個索引。

-
key

key 行是 Mysql 實際選用的索引。

-
key_len

key_len 行給出索引按位元組計算的長度,key_len數值越小,表示越快。

-
ref ref 行給出了關聯關系中另一個資料表裡的資料列的名字。 -
rows

rows 行是 Mysql 在執行這個查詢時,預計會從這個資料表裡讀出的資料行的個數。

-
extra extra 行提供了與關聯操作有關的資訊。可能的取值有 using filesort 、using temporary、using index、using where、impossible where using filesort (

需要額外的排序,性能損耗

)、using temporary(

使用到了臨時表,性能損耗

) 、using index(

索引覆寫,性能提升

)、using where(

需要回表查詢

)、impossible where(

where子句永遠為false

2.3、索引失效

       以下幾種情況會造成索引失效,使用explain指令加在要分析的sql語句前面,在執行結果中檢視key這一列的值,如果為NULL,說明沒有使用索引。

  • 1、

    like 以%開頭,索引無效;當like字首沒有%,字尾有%時,索引有效。

  • 2、

    or語句前後沒有同時使用索引。當or左右查詢字段隻有一個是索引,該索引失效,隻有當or左右查詢字段均為索引時,才會生效。

  • 3、

    組合索引,不是使用第一列索引,索引失效。

  • 4、

    資料類型出現隐式轉化。如varchar不加單引号的話可能會自動轉換為int型,使索引無效,産生全表掃描。

  • 5、

    在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,是以這樣的操作不能使用索引,可以用其他的辦法處理,例如:數字類型,判斷大于0,字元串類型設定一個預設值,判斷是否等于預設值即可。

  • 6、

    在索引字段上使用not,<>,!=。不等于操作符是永遠不會用到索引的,是以對它的處理隻會産生全表掃描。 優化方法: key<>0 改為 key>0 or key<0.

  • 7、

    對索引字段進行計算操作、字段上使用函數。

  • 8、

    當全表掃描速度比索引速度快時,mysql會使用全表掃描,此時索引失效。

.

繼續閱讀