Mysql索引優化之索引的分類

Coder小明發表於2019-07-04

Mysql的歷史

簡單回顧一下Mysql的歷史,Mysql 是一個關係型資料庫管理系統,由瑞典 Mysql AB 公司開發,目前屬於 Oracle 公司。關係型資料庫​將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

Mysql的優勢

  • Mysql 是開源的,所以你不需要支付額外的費用。
  • Mysql 支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
  • Mysql 使用標準的 SQL 資料語言形式。
  • Mysql 可以執行於多個系統上,並且支援多種語言。
  • Mysql 是可以定製的,採用了 GPL 協議,你可以修改原始碼來開發自己的 Mysql 系統。

索引的儲存分類

索引是在MYSQL的儲存引擎層中實現的,而不是在服務層實現的。所以每種儲存引擎的索引都不一定完全相同,也不是所有的儲存引擎都支援所有的索引型別。MYSQL目前提供了一下4種索引。

Normal 普通索引

基本的索引型別,大多數情況下都可以使用。

Unique 唯一索引

表示唯一的,不允許重複的索引,如果該欄位資訊保證不會重複,例如身份證號用作索引時,可設定為unique。Unique和Primary Key為列或列集合提供了唯一性的保證,Primary Key是擁有自動定義的Unique約束,但是每個表中可以有多個Unique約束,但是隻能有一個Primary Key約束。

Full Text 全文索引

全文索引可以在varchar、char、text型別的列上建立。MyISAM支援全文索引,InnoDB在mysql5.6之後支援了全文索引。FULLTEXT 用於搜尋很長一篇文章的時候,效果最好。用在比較短的文字,如果就一兩行字的,普通的 INDEX 也可以。

SPATIAL 空間索引

空間索引是對空間資料型別的欄位建立的索引,MYSQL中的空間資料型別有4種,分別是GEOMETRY(幾何)、POINT(點)、LINESTRING(線)、POLYGON(多邊形)。MYSQL使用SPATIAL關鍵字進行擴充套件,使得能夠用於建立正規索引型別的語法建立空間索引。建立空間索引的列,必須將其宣告為NOT NULL,空間索引只能在儲存引擎為MYISAM的表中建立。

我對索引的一些看法

  • MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是資料結構。
  • 資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能儘可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。
  • 最基本的查詢演算法當然是順序查詢(linear search),這種複雜度為O(n)的演算法在資料量很大時顯然是糟糕的,好在電腦科學的發展提供了很多更優秀的查詢演算法,例如二分查詢(binary search)、二叉樹查詢(binary tree search)等。
  • 如果稍微分析一下會發現,每種查詢演算法都只能應用於特定的資料結構之上,例如二分查詢要求被檢索資料有序,而二叉樹查詢只能應用於二叉查詢樹上,但是資料本身的組織結構不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。
  • 當你發現自己的查詢速度慢的時候,最快解決問題的方法就是使用索引。索引的使用是影響查詢速度的重要因素。在使用索引之前其他的優化查詢的動作純粹是浪費時間,只有合理地使用索引之後,才有必要考慮其他優化方式。

索引相關的概念先到這裡,後續會針對索引的實際應用和大家一起繼續交流。

歡迎關注微信公眾號,獲取更多資源

程式設計師小明

相關文章