回覆列表
  • 1 # lanfengz3

    簡單的說:查詢的時候生效。

    判斷mysql的索引生效的方法:

    用explain 來執行檢驗sql 例如

    explain select * from a

    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

    | id | select_type | table | type | possible_keys | key | key_len |ref | rows | Extra |

    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

    | 1 | SIMPLE | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | const | 1 | |

    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

    第四列 type

    這列很重要,顯示了連線使用了哪種類別,有無使用索引.

    從最好到最差的連線型別為const、eq_reg、ref、range、indexhe和ALL

    (1).system

    這是const聯接型別的一個特例。表僅有一行滿足條件.

    2).const

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

    3). eq_ref

    對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARYKEY。

    eq_ref可以用於使用=運算子比較的帶索引的列。比較值可以為常量或一個使用在該表前面所讀取的表的列的表示式。

    (4).ref

    對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是UNIQUE或PRIMARYKEY(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。

    ref可以用於使用=或運算子的帶索引的列。

    (5). ref_or_null

    該聯接型別如同ref,但是添加了MySQL可以專門搜尋包含NULL值的行。在解決子查詢中經常使用該聯接型別的最佳化。

    在下面的例子中,MySQL可以使用ref_or_null聯接來處理ref_tables:

    SELECT * FROM ref_table

    WHERE key_column=expr OR key_column IS NULL;

    (6). index_merge

    該聯接型別表示使用了索引合併最佳化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。

    例如:

    mysql> explain select * from t4 where id=3952602 oraccountid=31754306 ;

    +----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+

    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

    +----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+

    | 1 | SIMPLE | t4 | index_merge | idx_t4_id,idx_t4_accountid |idx_t4_id,idx_t4_accountid | 4,4 | NULL| 2 | Using union(idx_t4_id,idx_t4_accountid); Usingwhere |

    +----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+

    1 row in set (0.00 sec)

    (7). unique_subquery

    該型別替換了下面形式的IN子查詢的ref:

    value IN (SELECT primary_key FROM single_table WHEREsome_expr)

    unique_subquery是一個索引查詢函式,可以完全替換子查詢,效率更高。

    (8).index_subquery

    該聯接型別類似於unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引:

    value IN (SELECT key_column FROM single_table WHEREsome_expr)

    (9).range

    只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該型別中ref列為NULL。

    當使用=、、>、>=、、BETWEEN或者IN運算子,用常量比較關鍵字列時,可以使用range

    mysql> explain select * from t3 where id=3952602 or id=3952603;

    +----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+

    | id | select_type | table | type | possible_keys | key | key_len |ref | rows | Extra |

    +----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+

    | 1 | SIMPLE | t3 | range | PRIMARY,idx_t3_id | idx_t3_id | 4 | NULL | 2 | Using where |

    +----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+

    1 row in set (0.02 sec)

    (10).index

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

    當查詢只使用作為單索引一部分的列時,MySQL可以使用該聯接型別。

    (11). ALL

    對於每個來自於先前的表的行組合,進行完整的表掃描。如果表是第一個沒標記const的表,這通常不好,並且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基於前面的表中的常數值或列值被檢索出。

  • 中秋節和大豐收的關聯?
  • 上官婉兒一家被武則天滅族,為何她一點都不記恨?