深入學習MySQL,索引機制詳解,助你循序漸進出真知

前言

索引用於快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始讀完整個表,直到找出相關的行。表越大,查詢數據所花費的時間越多。如果表中查詢的列有一個索引,MySQL能快速到達某個位置去搜尋數據文件,而不必查看所有數據。

深入學習MySQL,索引機制詳解,助你循序漸進出真知

 

從今天起,我們就來介紹與索引相關的內容,包括索引的含義和特點、索引的分類、索引的設計原則以及如何創建和刪除索引等等。

那麼什麼是索引呢?

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可提高數據庫中特定數據的查詢速度。

MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。

打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。

拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查找到需要的字。

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

索引的含義及特點

索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據表裏所有記錄的引用指針。使用索引用於快速找出在某個或多個列中有一-特定值的行, 所有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索引。

深入學習MySQL,索引機制詳解,助你循序漸進出真知

 

索引的優點主要有以下幾條:

  • (1)通過創建唯一索引,可以保證數據庫表中每一行數據的唯一性。
  • (2)可以大大加快數據的查詢速度,這也是創建索引的最主要的原因。
  • (3)在實現數據的參考完整性方面,可以加速表和表之間的連接。
  • (4)在使用分組和排序子句進行數據查詢時,也可以顯著減少查詢中分組和排序的時間。

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

  • (1)創建索引和維護索引要耗費時間,並且隨着數據量的增加所耗費的時間也會增加。
  • (2)索引需要佔磁盤空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果有大量的索引,索引文件可能比數據文件更快達到最大文件尺寸。
  • (3)當對錶中的數據進行增加、刪除和修改的時候,索引也要動態地維護,這樣就降低了數據的維護速度。索引的分類

MySQL的索引可以分爲以下幾類:

1.普通索引和唯一索引

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

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

2.單列索引和組合索引

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

組合索引指在表的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用。使用組合索引時遵循最左前綴集合。

3.全文索引

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

4.空間索引

空間索引是對空間數據類型的字段建立的索引,MySQL中的空間數據類型有4種,分別是: GEOMETRY. POINT、LINESTRING 和POLYGON。MySQL使用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類似的語法創建空間索引。創建空間索引的列,必須將其聲明爲NOT NULL,空間索引只能在存儲引擎爲MyISAM的表中創建。

深入學習MySQL,索引機制詳解,助你循序漸進出真知

 

索引的設計原則

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

(1)索引並非越多越好,一個表中如有大量的索引,不僅佔用磁盤空間,而且會影響INSERT. DELETE、UPDATE等語句的性能,因爲當表中的數據更改的同時,索引也會進行調整和更新。

(2)避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。而對經常用於查詢的字段應該創建索引,但要避免添加不必要的字段。

(3)數據量小的表最好不要使用索引,由於數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。

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

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

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

好了,今天的MySQL索引介紹就先到這了,給大家夯實一下基礎,明天咱們繼續更新,MySQL索引是如何創建的,有興趣瞭解的朋友,請關注小編,明天同一時間,咱們不見不散~~~

喜歡小編請多多點贊評論轉發,關注小編,你們的支持就是小編最大的動力!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章