數(shù)據(jù)庫(kù)高級(jí)操作——索引

索引

MySQL官方對(duì)索引的定義為:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。提取句子主干,就可以得到索引的本質(zhì):索引是數(shù)據(jù)結(jié)構(gòu)到逊。

索引的存儲(chǔ)分類

索引是在MYSQL的存儲(chǔ)引擎層中實(shí)現(xiàn)的用狱,而不是在服務(wù)層實(shí)現(xiàn)的。所以每種存儲(chǔ)引擎的索引都不一定完全相同译仗,也不是所有的存儲(chǔ)引擎都支持所有的索引類型。MYSQL目前提供了一下4種索引官觅。

  • B-Tree 索引:最常見的索引類型纵菌,大部分引擎都支持B樹索引。
  • HASH 索引:只有Memory引擎支持休涤,使用場(chǎng)景簡(jiǎn)單咱圆。
  • R-Tree 索引(空間索引):空間索引是MyISAM的一種特殊索引類型,主要用于地理空間數(shù)據(jù)類型功氨。
  • Full-text (全文索引):全文索引也是MyISAM的一種特殊索引類型序苏,主要用于全文索引,InnoDB從MYSQL5.6版本提供對(duì)全文索引的支持捷凄。

MyISAM忱详、InnoDB引擎、Memory三個(gè)常用引擎類型比較

索引 MyISAM引擎 InnoDB引擎 Memory引擎
B-Tree 索引 支持 支持 支持
HASH 索引 不支持 不支持 支持
R-Tree 索引 支持 不支持 不支持
Full-text 索引 不支持 暫不支持 不支持

索引的創(chuàng)建跺涤、刪除

索引的類型:

  • UNIQUE(唯一索引):不可以出現(xiàn)相同的值匈睁,可以有NULL值
  • INDEX(普通索引):允許出現(xiàn)相同的索引內(nèi)容
  • PROMARY KEY(主鍵索引):不允許出現(xiàn)相同的值
  • fulltext index(全文索引):可以針對(duì)值中的某個(gè)單詞,但效率確實(shí)不敢恭維
  • 組合索引:實(shí)質(zhì)上是將多個(gè)字段建到一個(gè)索引里桶错,列值的組合必須唯一
1航唆、使用ALTER TABLE語(yǔ)句創(chuàng)建索性

? 應(yīng)用于表創(chuàng)建完畢之后再添加。

ALTER TABLE 表名 ADD 索引類型 (unique,primary key,fulltext,index)[索引名](字段名)
//普通索引
alter table table_name add index index_name (column_list) ;
//唯一索引
alter table table_name add unique (column_list) ;
//主鍵索引
alter table table_name add primary key (column_list) ;
//自增主鍵
alter table_name change column_name  int not null primary key auto_increment;

ALTER TABLE可用于創(chuàng)建普通索引院刁、UNIQUE索引和PRIMARY KEY索引3種索引格式糯钙,table_name是要增加索引的表名,column_list指出對(duì)哪些列進(jìn)行索引,多列時(shí)各列之間用逗號(hào)分隔任岸。索引名index_name可選鸳玩,缺省時(shí),MySQL將根據(jù)第一個(gè)索引列賦一個(gè)名稱演闭。另外不跟,ALTER TABLE允許在單個(gè)語(yǔ)句中更改多個(gè)表,因此可以同時(shí)創(chuàng)建多個(gè)索引米碰。

2窝革、使用CREATE INDEX語(yǔ)句對(duì)表增加索引

? CREATE INDEX可用于對(duì)表增加普通索引或UNIQUE索引,可用于建表時(shí)創(chuàng)建索引吕座。

CREATE INDEX index_name ON table_name(username(length)); 

如果是CHAR虐译,VARCHAR類型,length可以小于字段實(shí)際長(zhǎng)度吴趴;如果是BLOB和TEXT類型漆诽,必須指定length。

//create只能添加這兩種索引;
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)

3锣枝、刪除索引

? 刪除索引可以使用ALTER TABLE或DROP INDEX語(yǔ)句來(lái)實(shí)現(xiàn)厢拭。DROP INDEX可以在ALTER TABLE內(nèi)部作為一條語(yǔ)句處理,其格式如下:

drop index index_name on table_name ;

alter table table_name drop index index_name ;

alter table table_name drop primary key ;

其中,在前面的兩條語(yǔ)句中,都刪除了table_name中的索引index_name茫多。而在最后一條語(yǔ)句中未斑,只在刪除PRIMARY KEY索引中使用,因?yàn)?strong>一個(gè)表只可能有一個(gè)PRIMARY KEY索引,因此不需要指定索引名。如果沒有創(chuàng)建PRIMARY KEY索引,但表具有一個(gè)或多個(gè)UNIQUE索引寨闹,則MySQL將刪除第一個(gè)UNIQUE索引。

? 如果從表中刪除某列君账,則索引會(huì)受影響繁堡。對(duì)于多列組合的索引,如果刪除其中的某列杈绸,則該列也會(huì)從索引中刪除帖蔓。如果刪除組成索引的所有列,則整個(gè)索引將被刪除瞳脓。

索引的使用及注意事項(xiàng)

索引選擇

一塑娇、索引選擇原則
  1. 較頻繁的作為查詢條件的字段應(yīng)該創(chuàng)建索引
  2. 唯一性太差的字段不適合單獨(dú)創(chuàng)建索引,即使頻繁作為查詢條件
  3. 更新非常頻繁的字段不適合創(chuàng)建索引
  4. 不會(huì)出現(xiàn)在 WHERE 子句中的字段不該創(chuàng)建索引
二 劫侧、索引選擇原則細(xì)述
  1. 性能優(yōu)化過程中埋酬,選擇在哪個(gè)列上創(chuàng)建索引是最非常重要的哨啃。可以考慮使用索引的主要有 兩種類型的列:在where子句中出現(xiàn)的列写妥,在join子句中出現(xiàn)的列拳球,而不是在SELECT關(guān)鍵字后選擇列表的列;
  2. 索引列的基數(shù)越大珍特,索引的效果越好祝峻。例如,存放出生日期的列具有不同的值扎筒,很容易區(qū)分行莱找,而用來(lái)記錄性別的列,只有"M"和"F",則對(duì)此進(jìn)行索引沒有多大用處嗜桌,因此不管搜索哪個(gè)值奥溺,都會(huì)得出大約一半的行;
  3. 使用短索引,如果對(duì)字符串列進(jìn)行索引骨宠,應(yīng)該指定一個(gè)前綴長(zhǎng)度浮定,可節(jié)省大量索引空間,提升查詢速度层亿;
三桦卒、不建議索引的情況
  1. 表記錄比較少,例如一兩千條甚至只有幾百條記錄的表棕所,沒必要建索引闸盔,讓查詢做全表掃描就好了;
  2. 索引的選擇性較低。所謂索引的選擇性(Selectivity)琳省,是指不重復(fù)的索引值(也叫基數(shù),Cardinality)與表記錄數(shù)(#T)的比值躲撰,選擇性越高的索引價(jià)值越大针贬,這是由B+Tree的性質(zhì)決定的
    Index Selectivity = Cardinality / #T

索引弊端

索引是完全獨(dú)立于基礎(chǔ)數(shù)據(jù)之外的一部分?jǐn)?shù)據(jù)。假設(shè)在Table ta 中的Column ca 創(chuàng)建了索引 idx_ta_ca拢蛋,那么任何更新 Column ca 的操作桦他,MySQL在更新表中 Column ca的同時(shí),都須要更新Column ca 的索引數(shù)據(jù)谆棱,調(diào)整因?yàn)楦聨?lái)鍵值變化的索引信息快压。而如果沒有對(duì) Column ca 進(jìn)行索引,MySQL要做的僅僅是更新表中 Column ca 的信息垃瞧。這樣蔫劣,最明顯的資源消耗就是增加了更新所帶來(lái)的 IO 量和調(diào)整索引所致的計(jì)算量。此外个从,Column ca 的索引idx_ta_ca須要占用存儲(chǔ)空間脉幢,而且隨著 Table ta 數(shù)據(jù)量的增加歪沃,idx_ta_ca 所占用的空間也會(huì)不斷增加,所以索引還會(huì)帶來(lái)存儲(chǔ)空間資源消耗的增加嫌松。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沪曙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萎羔,更是在濱河造成了極大的恐慌液走,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贾陷,死亡現(xiàn)場(chǎng)離奇詭異缘眶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昵宇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門磅崭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓦哎,你說我怎么就攤上這事砸喻。” “怎么了蒋譬?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵割岛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我犯助,道長(zhǎng)癣漆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任剂买,我火速辦了婚禮惠爽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞬哼。我一直安慰自己婚肆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布坐慰。 她就那樣靜靜地躺著较性,像睡著了一般。 火紅的嫁衣襯著肌膚如雪结胀。 梳的紋絲不亂的頭發(fā)上赞咙,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音糟港,去河邊找鬼攀操。 笑死,一個(gè)胖子當(dāng)著我的面吹牛着逐,可吹牛的內(nèi)容都是我干的崔赌。 我是一名探鬼主播意蛀,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼健芭!你這毒婦竟也來(lái)了县钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤慈迈,失蹤者是張志新(化名)和其女友劉穎若贮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痒留,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谴麦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伸头。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾效。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恤磷,靈堂內(nèi)的尸體忽然破棺而出面哼,到底是詐尸還是另有隱情,我是刑警寧澤扫步,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布魔策,位于F島的核電站,受9級(jí)特大地震影響河胎,放射性物質(zhì)發(fā)生泄漏闯袒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一游岳、第九天 我趴在偏房一處隱蔽的房頂上張望政敢。 院中可真熱鬧,春花似錦胚迫、人聲如沸堕仔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至通贞,卻和暖如春朗若,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昌罩。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工哭懈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茎用。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓遣总,卻偏偏與公主長(zhǎng)得像睬罗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旭斥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容