Mysql數(shù)據(jù)庫中的索引

一庵佣、索引概述

索引(index)是幫助Mysql高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)。在數(shù)據(jù)之外撞芍,數(shù)據(jù)庫還維護者滿足特定算法的數(shù)據(jù)結(jié)構(gòu)秧了,這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)實現(xiàn)高級查找算法序无,這種數(shù)據(jù)結(jié)構(gòu)就是索引验毡。


圖示

左邊是數(shù)據(jù)表,一共7條數(shù)據(jù)帝嗡,最左側(cè)是(0x07...)這些是數(shù)據(jù)的物理地址(邏輯上相鄰的數(shù)據(jù)晶通,在磁盤記錄中也不一定是物理相鄰的)。
在沒建立索引的情況下:我們想要獲取col2中的值需要一條條的便利尋找哟玷,如果尋找值為3的數(shù)據(jù)狮辽,相當(dāng)于做了一次整張表掃描
建立索引的情況下:維護右側(cè)二叉查找樹,每個節(jié)點包含索引鍵值和指向?qū)?yīng)數(shù)據(jù)的記錄物理地址的指針巢寡,再獲取值為3的數(shù)據(jù)時喉脖,根據(jù)索引,只需要三步就能找到對應(yīng)的數(shù)據(jù)抑月,不需要掃描全表

二树叽、索引的優(yōu)劣

優(yōu)勢:
1)類似書籍目錄的索引,提高了數(shù)據(jù)的檢索效率谦絮,降低了數(shù)據(jù)庫的IO成本
2)通過索引對數(shù)進行排序题诵,降低了數(shù)據(jù)的排序成本,降低了CPU的消耗
劣勢:
1)實際索引也是一張表层皱,該表保存了主鍵和索引字段性锭,并指向?qū)嶓w類的字段,所以索引也需要占用空間
2)雖然索引大大提高了查詢效率叫胖,但同時也降低了更新表的速度草冈,如對表進行Insert,update,delete操作時,Mysql不僅需要更新數(shù)據(jù)臭家,同時還要保存索引文件每次更新添加了索引列的字段以及調(diào)整因為更新所帶來的鍵值變化后的索引信息

三疲陕、索引結(jié)構(gòu)

索引實在Mysql的存儲引擎中實現(xiàn)的,所以每一種引擎的索引結(jié)構(gòu)都不一定相同钉赁,同時也不是所有的搜索引擎支持所有的索引結(jié)構(gòu),Mysql為我們提供了一下四種索引結(jié)構(gòu)
1)BTREE索引:最常見的索引類型携茂,大部分搜索引擎都支持B樹索引
2)Hash索引:只有Memory引擎支持 你踩, 使用場景簡單
3)R-tree 索引(空間索引):空間索引是MyISAM引擎的一個特殊索引類型,主要用于地理空間數(shù)據(jù)類型,通常使用較少
4)Full-text (全文索引) :全文索引也是MyISAM的一個特殊索引類型带膜,主要用于全文索引吩谦,InnoDB從Mysql5.6版本開始支持全文索引


索引類型支持

ps:這里暫不做索引結(jié)構(gòu)的說明

四、索引分類

1)單值索引:即一個索引包含單個列膝藕,一個表可以有多個單列索引
2)唯一索引:索引列的值必須唯一式廷,但允許為空
3)復(fù)合索引:既一個列包含多個索引

五、創(chuàng)建索引

1)創(chuàng)建數(shù)據(jù)庫及表

# 創(chuàng)建 demo_01
CREATE DATABASE demo_01 DEFAULT charset=utf8mb4;
# 使用 數(shù)據(jù)庫
USE demo_01;

#創(chuàng)建表
CREATE TABLE `city` (
  `city_id` int(11) NOT NULL AUTO_INCREMENT,
  `city_name` varchar(50) NOT NULL,
  `country_id` int(11) NOT NULL,
  PRIMARY KEY (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `city` (`city_id`, `city_name`, `country_id`) values(1,'西安',1);
insert into `city` (`city_id`, `city_name`, `country_id`) values(2,'NewYork',2);
insert into `city` (`city_id`, `city_name`, `country_id`) values(3,'北京',1);
insert into `city` (`city_id`, `city_name`, `country_id`) values(4,'上海',1);

insert into `country` (`country_id`, `country_name`) values(1,'China');
insert into `country` (`country_id`, `country_name`) values(2,'America');
insert into `country` (`country_id`, `country_name`) values(3,'Japan');
insert into `country` (`country_id`, `country_name`) values(4,'UK');

2)創(chuàng)建索引
創(chuàng)建索引語法:

CREATE  [UNIQUE|FULLTEXT|SPATIAL]  INDEX index_name 
[USING  index_type]
ON tbl_name(index_col_name,...)


index_col_name : column_name[(length)][ASC | DESC]

示列:為city表中的city_name 創(chuàng)建索引

create index idx_city_name on city(city_name);

3)查看索引
查看索引語法

show index from tab_name

示列:查看city_name表中的索引

show index from city_name
索引查看結(jié)果

ps:city_id作為自增長主鍵芭挽,mysql會自動幫我創(chuàng)建索引
4)刪除索引
刪除索引語法

DROP  INDEX  index_name  ON  tbl_name;

示列:刪除我們我們剛剛創(chuàng)建的idx_city_name索引

drop index idx_city_name from city;

5)ALTER命令創(chuàng)建索引
添加一個主鍵滑废,這意味著索引值必須是唯一的,且不能為NULL

alter  table  tb_name  add  primary  key(column_list); 

創(chuàng)建索引的值必須是唯一的(除了NULL外袜爪,NULL可能會出現(xiàn)多次)

alter  table  tb_name  add  unique index_name(column_list);

普通索引蠕趁, 索引值可以出現(xiàn)多次。

alter  table  tb_name  add  index index_name(column_list);

指定了索引為FULLTEXT辛馆, 用于全文索引

alter  table  tb_name  add  fulltext  index_name(column_list);

6)創(chuàng)建復(fù)合索引

CREATE INDEX idx_name_email_status ON tb_seller(NAME,email,STATUS);

就相當(dāng)于
對name 創(chuàng)建索引 ;
對name , email 創(chuàng)建了索引 ;
對name , email, status 創(chuàng)建了索引 ;

六俺陋、索引的設(shè)計原則

1)對查詢頻次較高且數(shù)據(jù)量比較大的表建立索引
2)索引字段最佳候選列應(yīng)當(dāng)從where子語句中條件中提取,如果where子語句條件過多昙篙,那么應(yīng)當(dāng)挑選最常用腊状,過濾效果最好的的列的組合
3)使用唯一索引,區(qū)分度越高苔可,使用索引的效率越高
4)索引可以有效的提升查詢數(shù)據(jù)的效率缴挖,但索引數(shù)量不是多多益善,索引越多硕蛹,維護索引的代價自然也就水漲船高醇疼。對于插入、更新法焰、刪除等DML操作比較頻繁的表來說秧荆,索引過多,會引入相當(dāng)高的維護代價埃仪,降低DML操作的效率乙濒,增加相應(yīng)操作的時間消耗。另外索引過多的話卵蛉,MySQL也會犯選擇困難病颁股,雖然最終仍然會找到一個可用的索引,但無疑提高了選擇的代價
5)使用短索引傻丝,索引創(chuàng)建之后也是使用硬盤來存儲的甘有,因此提升索引訪問的I/O效率,也可以提升總體的訪問效率葡缰。假如構(gòu)成索引的字段總長度比較短亏掀,那么在給定大小的存儲塊內(nèi)可以存儲更多的索引值忱反,相應(yīng)的可以有效的提升MySQL訪問索引的I/O效率
6)利用最左前綴,N個列組合而成的組合索引滤愕,那么相當(dāng)于是創(chuàng)建了N個索引温算,如果查詢時where子句中使用了組成該索引的前幾個字段,那么這條查詢SQL可以利用組合索引來提升查詢效率

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末间影,一起剝皮案震驚了整個濱河市注竿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魂贬,老刑警劉巖巩割,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異随橘,居然都是意外死亡喂分,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門机蔗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲祈,“玉大人,你說我怎么就攤上這事萝嘁“鸬В” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵牙言,是天一觀的道長酸钦。 經(jīng)常有香客問我,道長咱枉,這世上最難降的妖魔是什么卑硫? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚕断,結(jié)果婚禮上欢伏,老公的妹妹穿的比我還像新娘。我一直安慰自己亿乳,他們只是感情好硝拧,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葛假,像睡著了一般障陶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聊训,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天抱究,我揣著相機與錄音,去河邊找鬼带斑。 笑死媳维,一個胖子當(dāng)著我的面吹牛酿雪,可吹牛的內(nèi)容都是我干的遏暴。 我是一名探鬼主播侄刽,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼朋凉!你這毒婦竟也來了州丹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杂彭,失蹤者是張志新(化名)和其女友劉穎墓毒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亲怠,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡所计,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了团秽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主胧。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖习勤,靈堂內(nèi)的尸體忽然破棺而出踪栋,到底是詐尸還是另有隱情,我是刑警寧澤图毕,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布夷都,位于F島的核電站,受9級特大地震影響予颤,放射性物質(zhì)發(fā)生泄漏囤官。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一蛤虐、第九天 我趴在偏房一處隱蔽的房頂上張望党饮。 院中可真熱鬧,春花似錦笆焰、人聲如沸劫谅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捏检。三九已至,卻和暖如春不皆,著一層夾襖步出監(jiān)牢的瞬間贯城,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工霹娄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留能犯,地道東北人鲫骗。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像踩晶,于是被迫代替她去往敵國和親执泰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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