掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
按照功能來劃分,索引主要有四種:

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出衢州免費(fèi)做網(wǎng)站回饋大家。
普通索引就是最最基礎(chǔ)的索引,這種索引沒有任何的約束作用,它存在的主要意義就是提高查詢效率。
普通索引創(chuàng)建方式如下:
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
name 字段就是一個(gè)普通索引(括號外面的是索引名,里邊的是索引的字段)。
唯一性索引則在普通索引的基礎(chǔ)上增加了數(shù)據(jù)唯一性的約束,一張表中可以同時(shí)存在多個(gè)唯一性索引,唯一性索引創(chuàng)建方式如下:
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
name 字段就是唯一性索引。
主鍵索引則是在唯一性索引的基礎(chǔ)上又增加了不為空的約束(換言之,添加了唯一性索引的字段,是可以包含 NULL 值的),即 NOT NULL+UNIQUE,一張表里最多只有一個(gè)主鍵索引,當(dāng)然一個(gè)主鍵索引中可以包含多個(gè)字段。
前面兩個(gè)例子中都有主鍵索引的創(chuàng)建方式,我這里就不再列舉了。
全文索引其實(shí)我們很少在 MySQL 中用,如果項(xiàng)目中有做全文索引的需求,一般可以通過 Elasticsearch 或者 Solr 來做,目前比較流行的就是 Elasticsearch 了,松哥之前也錄過專門的視頻,公眾號后臺回復(fù) es 獲取教程鏈接。
全文索引在 MySQL 中支持的版本也需要大家留意一下:
創(chuàng)建全文索引對字段類型也有要求,只有字段的數(shù)據(jù)類型為 CHAR、VARCHAR 以及 TEXT 等才可以建立全文索引。
MySQL 的全文索引最開始只支持英文,因?yàn)橛⑽姆衷~比較方便;中文分詞就比較麻煩,所以最早的 MySQL 全文索引是不支持中文的。從 MySQL5.7.6 版本開始,引入了 ngram 全文分析器來解決分詞問題,并且這個(gè)分詞器對 MyISAM 和 InnoDB 引擎都有效。
不過 MySQL 的全文索引并不好用,有這方面的需求還是直接上 Es 吧。
全文索引的創(chuàng)建方式如下:
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
name 字段就是全文索引。
按照物理實(shí)現(xiàn)方式,索引可以分為兩大類:
聚集索引在存儲的時(shí)候,可以按照主鍵(不是必須,看情況)來排序存儲數(shù)據(jù),B+Tree 的葉子結(jié)點(diǎn)就是完整的數(shù)據(jù)行,查找的時(shí)候,找到了主鍵也就找到了完整的數(shù)據(jù)行。
如下圖,在聚集索引中,葉子結(jié)點(diǎn)保存了每一行的數(shù)據(jù)。
在聚集索引里,表中數(shù)據(jù)行按索引的排序方式進(jìn)行存儲,對查找行很有效。只有當(dāng)表包含聚集索引時(shí),表內(nèi)的數(shù)據(jù)行才會按找索引列的值在磁盤上進(jìn)行物理排序和存儲。每張表只能有一個(gè)聚集索引,原因很簡單,因?yàn)閿?shù)據(jù)行本身只能按一個(gè)順序存儲。
當(dāng)我們基于 InnoDB 引擎創(chuàng)建一張表的時(shí)候,都會創(chuàng)建一個(gè)聚集索引,每張表都有唯一的聚集索引:
聚集索引最主要的優(yōu)勢就是查詢快。如果要查詢完整的數(shù)據(jù)行,使用非聚集索引往往需要回表才能實(shí)現(xiàn),而使用聚集索引則能一步到位。
不過聚集索引也有一些劣勢:
非聚集索引我們一般也稱為二級索引或者輔助索引,對于非聚集索引,數(shù)據(jù)庫會有單獨(dú)的存儲空間來存放。非聚集索引在查找的時(shí)候要經(jīng)過兩個(gè)步驟,例如執(zhí)行 select * from user where username='javaboy'(假設(shè) username 字段是非聚集索引),那么此時(shí)需要先搜索 username 這一列索引的 B+Tree,這個(gè) B+Tree 的葉子結(jié)點(diǎn)存儲的不是完整的數(shù)據(jù)行,而是主鍵值,當(dāng)我們搜索完成后得到主鍵的值,然后拿著主鍵值再去搜索主鍵索引的 B+Tree,就可以獲取到一行完整的數(shù)據(jù)。
所以如果我們在查詢中用到了非聚集索引,那么就會搜索兩棵 B+Tree,第一次搜索 B+Tree 拿到主鍵值后再去搜索聚集索引的 B+Tree,這個(gè)過程就是所謂的回表。
一張表只能有一個(gè)聚集索引,但可以有多個(gè)非聚集索引。使用聚集索引的時(shí)候,數(shù)據(jù)的查詢效率高,但如果對數(shù)據(jù)進(jìn)行插入,刪除,更新等操作,效率會比非聚集索引低。
總的來說,數(shù)據(jù)庫索引可以按照兩種思路來分類:按照功能分和按照存儲方式分。
按照功能分,可以分四種:
按照存儲方式分,可以分兩種:
每種之間有區(qū)別又有聯(lián)系,希望上文能為大家解惑。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流