MySQL 中的索引
索引用來加速查詢。正常來說,當查詢資料時,MySQL 需要從表的第一條記錄開始,讀取整個表的內容,進行查詢。 但如果有索引,MySQL 可根據索引快速定位需要查詢條目的具體位置,加快了查詢速度。 原理索引的原理是將被索引列的值,單獨取出來存到另一種結構中以獲取快速查詢的效果。 當列有這些屬性中任意一個時,會被索引, 大部分索引以 B-trees 結構儲存。但有些例外:
MySQL 使用索引的場景以下場景將藉助或依賴於索引:
索引並不是萬能的,對於資料量小的表以及對於那些查詢全部資料的操作,索引的效果並不明顯。相反,對於那些查詢時涉及到表中大部分資料的情況下,逐條查詢比使用索引要快。 索引的型別主要有以下四種索引型別,關於建立索引的其他詳情可參見 MySQL Manual - 13.1.15 CREATE INDEX Syntax。
Index Prefixes對於字串型別的列,在索引建立語法中指定 CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); 查詢時,如果查詢項超過了索引長度,索引將用來排除掉那些在索引長度範圍內匹配失敗的記錄,剩下的記錄則正常查詢。 FULLTEXT 索引全文字索引用於全文字(full-text)的搜尋。只 InnoDB 和 MyISAM 兩種引擎下的 CHAR,VARCHAR,TEXT 資料型別支援全文字索引。不像 Index Prefixes,該型別的索引是會對整列的。 Spatial 索引Spatial Data 資料型別 上建立的索引。 MEMORY Storage Engine 中的索引MEMORY 儲存引擎預設使用 HASH 索引,但也支援 BTREE 索引。 索引的建立索引可在建立表時建立,參考 13.1.20 CREATE TABLE Syntax,也可針對已有的表進行建立,使用 CREATE INDEX 語句。 建立索引的語法CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name [index_type] ON tbl_name (key_part,...) [index_option] [algorithm_option | lock_option] ... key_part: {col_name [(length)] | (expr)} [ASC | DESC] index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name | COMMENT 'string' | {VISIBLE | INVISIBLE} index_type: USING {BTREE | HASH} algorithm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY} lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE} 有如下型別的索引指定方式,
以列字首的方可用於建立列中指定字首部分 示例: CREATE INDEX part_of_name ON customer (name(10)); 以上語句對名為 函式形式普通形式的索引只能索引列中的值,比如: CREATE TABLE t1 ( col1 VARCHAR(10), col2 VARCHAR(20), INDEX (col1, col2(10)) ); 以上語句對 但使用函式形式,可建立針對表示式的索引,而不是表中的列。 CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1)))); CREATE INDEX idx1 ON t1 ((col1 + col2)); CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1); ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC); 函式形式的索引在定義時需要滿足以下的條件,否則拋錯:
/* |