MySQL中的索引(一)概述

索引

在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù)。這種數(shù)據(jù)結(jié)構(gòu)就是索引,它能夠幫助我們高效獲取數(shù)。

索引的優(yōu)點
  1. 提高數(shù)據(jù)查詢速度,降低數(shù)據(jù)庫的IO成本;
  2. 通過索引對數(shù)據(jù)進行排序,降低數(shù)據(jù)排序的成本,降低了CPU的消耗。
索引的缺點
  1. 降低INSERT、UPDATE、DELETE的操作數(shù)據(jù),因為要更新索引;
  2. 索引也需要維護一張表,會占用物理空間。

哪些情況需要創(chuàng)建索引

1.主鍵自動建立唯一索引

2.頻繁作為查詢條件的字段應該創(chuàng)建索引

3.查詢中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引

4.單鍵/組合索引的選擇問題,who?(在高并發(fā)下傾向創(chuàng)建組合索引)

5.查詢中排序的字段,排序的字段若通過索引去訪問將大大提高排序速度

6.查詢中統(tǒng)計或者分組字段

哪些情況不要創(chuàng)建索引

1.表記錄太少

2.經(jīng)常增刪改的表。

3.某個數(shù)據(jù)列唯一性很差(包含許多重復的內(nèi)容),為它建立索引就沒有太大的實際效果。

4.WHERE條件里用不到的字段不創(chuàng)建索引

MySQL中的索引

索引的類型

MySQL目前主要有以下幾種索引類型:

  • 普通索引
  • 唯一索引
  • 主鍵索引
  • 組合索引
  • 全文索引
和索引相關(guān)的SQL

1.查看索引
show index from table_name;
2.刪除索引
drop index [index_name] on table_name;
3.新增索引

(1).直接創(chuàng)建索引

CREATE INDEX index_name ON table(column(length))

(2).修改表結(jié)構(gòu)的方式添加索引

ALTER TABLE table_name ADD INDEX index_name ON (column(length))

(3).創(chuàng)建表的時候同時創(chuàng)建索引

CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) CHARACTER NOT NULL ,
     PRIMARY KEY (`id`), 
     INDEX index_name (title(length))
)

3.1 創(chuàng)建不同類型的索引

-- 主鍵索引
ALTER TABLE table_name ADD PRIMARY KEY (column_list);
-- 唯一索引
ALTER TABLE table_name ADD UNIQUE index_name (column_list);
-- 普通索引
ALTER TABLE table_name ADD INDEX index_name (column_list);
-- 全文索引
ALTER TABLE table_name ADD FULLTEXT index_name (column_list);

根據(jù)所使用的數(shù)據(jù)結(jié)構(gòu),MySQL中所使用的索引有如下幾種

  • B-Tree索引
  • Hash索引
  • Full-text全文索引
  • R-Tree索引

B-Tree索引

B-Tree索引的物理文件大多以Balance Tree來存儲,也就是實際的數(shù)據(jù)都存放于Tree的Leaf Node當中,且從Root Node到任何一個Leaf Node的最短路徑的長度都是完全相同。

B-Tree索引是MySQL中使用最為頻繁的索引類型,除了Archive存儲引擎之外的其他所有的存儲引擎都支持B-Tree索引。不過在InnoDB中,它使用的數(shù)據(jù)結(jié)構(gòu)是B-Tree的變種B+Tree,其在B-Tree的基礎上做了改動:每一個Leaf Node上面除了存放索引鍵的相關(guān)信息之外,還存儲了指向與該Leaf Node相鄰的后一個Leaf Node的指針信息,這主要是為了加快檢索多個相鄰Leaf Node的效率。

Hash索引

Hash索引通過Hash算法來實現(xiàn),目前主要用在MySQL的Memory和NDB Cluster存儲引擎當中。

我們知道Hash的效率是非常高的,它通過計算hash值能夠一次定位到數(shù)據(jù),也就是說一次IO操作就可以完成數(shù)據(jù)的檢索。而不像B-Tree索引要從根節(jié)點找到葉子節(jié)點,樹有多高就需要多少次IO操作。既然如此,那么為啥不直接都使用Hash索引呢?因為Hash索引存在以下缺點:

  • Hash索引無法引用在范圍查找中;
  • 無法通過Hash索引來避免數(shù)據(jù)的排序操作;
  • 當Key發(fā)生了Hash沖突時,查詢就變得麻煩了(可能需要全表掃描)。

Full-text索引

Full-text索引在MySQL中,僅有MyISAM存儲引擎支持它,且只有數(shù)據(jù)類型為CHAR、VARCHAR、TEXT的列可以創(chuàng)建Full-txt索引。

Fulltext索引主要用來替代效率低下的LIKE '%***%'操作,F(xiàn)ull-text索引在中文支持方面還不太好,須要借助第三方的補丁或插件來完成,且Full-text的創(chuàng)建所消耗的資源也比較大,所以在應用于實際生產(chǎn)環(huán)境之前還是盡量做好評估。

R-Tree索引

主要用來解決空間數(shù)據(jù)檢索的問題,常用于MyISAM存儲引擎中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容