MySQL的索引

brucexia發表於2024-10-09

MySQL索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可提高資料庫中特定資料的查詢效率。本節將介紹索引的含義、分類和設計原則。

7.1.1 索引的含義和特點
索引是一個單獨的、儲存在磁碟上的資料庫結構,包含了對資料表裡所有記錄的引用指標。使用索引可以快速找出在某個或多個列中有一特定值的行,所有MySQL列型別都可以被索引。對相關列使用索引是加快查詢操作速度的最佳途徑。

例如,資料庫中有2萬條記錄,現在要執行一個查詢“SELECT * FROM table where num=10000”,如果沒有索引,就必須遍歷整張表,直到num等於10000的這一行被找到為止;如果在num列上建立索引,MySQL不需要任何掃描,直接在索引裡面找10000,就可以得知這一行的位置。可見,索引的建立可以加快資料庫的查詢速度。

索引是在儲存引擎中實現的,每種儲存引擎的索引都不一定完全相同,並且每種儲存引擎也不一定支援所有索引型別。根據儲存引擎來定義每張表的最大索引數和最大索引長度。所有儲存引擎支援每張表至少16個索引,總索引長度至少為256位元組。大多數儲存引擎有更高的限制。MySQL中索引的儲存型別有兩種,即BTREE和HASH,具體和表的儲存引擎相關:MyISAM和InnoDB儲存引擎只支援BTREE索引;MEMORY/HEAP儲存引擎可以支援HASH和BTREE索引。

索引的優點主要有以下4點:

(1)透過建立唯一索引,可以保證資料庫表中每一行資料的唯一性。

(2)可以大大加快資料的查詢速度,這也是建立索引的主要原因。

(3)在實現資料的參考完整性方面,可以加速表和表之間的連線。

(4)在使用分組和排序子句進行資料查詢時,可以顯著減少查詢中分組和排序的時間。

增加索引也有許多不利的方面,主要表現在如下3個方面:

(1)建立索引和維護索引要耗費時間,並且隨著資料量的增加,所耗費的時間也會增加。

(2)索引需要佔磁碟空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間。如果有大量的索引,則索引檔案可能比資料檔案更快達到最大檔案尺寸。

(3)當對錶中的資料進行增加、刪除和修改時,索引也要動態地維護,這樣就降低了資料的維護速度。

7.1.2 索引的分類
MySQL的索引可以分為以下幾類。

1. 普通索引和唯一索引

普通索引是MySQL中的基本索引型別,允許在定義索引的列中插入重複值和空值。

唯一索引要求索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。主鍵索引是一種特殊的唯一索引,不允許有空值。

2. 單列索引和組合索引

單列索引即一個索引只包含單個列,一張表可以有多個單列索引。

組合索引是指在表的多個欄位組合上建立的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用。使用組合索引時遵循“最左字首”原則。

3. 全文索引

全文索引型別為FULLTEXT,在定義索引的列上支援值的全文查詢,允許在這些索引列中插入重複值和空值。全文索引可以在CHAR、VARCHAR或者TEXT型別的列上建立。MySQL中只有MyISAM儲存引擎支援全文索引。

4. 空間索引

空間索引是對空間資料型別的欄位建立的索引,MySQL中的空間資料型別有4種,分別是GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL關鍵字進行擴充套件,使得能夠用與建立正規索引類似的語法建立空間索引。建立空間索引的列,必須宣告為NOT NULL,空間索引只能在儲存引擎為MyISAM的表中建立。

7.1.3 索引的設計原則
索引設計不合理或者缺少索引都會對資料庫和應用程式的效能造成障礙。高效的索引對於獲得良好的效能非常重要。設計索引時,應該考慮以下準則:

(1)索引並非越多越好,一張表中如有大量的索引,不僅佔用磁碟空間,還會影響INSERT、DELETE、UPDATE等語句的效能,因為表中的資料更改時,索引也會進行調整和更新。

(2)避免對經常更新的表進行過多索引,並且索引中的列要儘可能少。應該為經常用於查詢的欄位建立索引,但要避免新增不必要的欄位。

(3)資料量小的表最好不要使用索引,當資料較少時,查詢花費的時間可能比遍歷索引的時間還要短,因此索引可能不會產生最佳化效果。

(4)在條件表示式中經常用到的不同值較多的列上建立索引,在不同值很少的列上不要建立索引。比如學生表的“性別”欄位上只有“男”與“女”兩個不同值,因此無須建立索引,如果建立索引,不但不會提高查詢效率,反而會嚴重降低資料更新速度。

(5)當唯一性是某種資料本身的特徵時,指定唯一索引。使用唯一索引時要確保定義的列的資料完整性,以提高查詢速度。

(6)在頻繁進行排序或分組(即進行GROUP BY或ORDER BY操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
————————————————

相關文章