索引用法和利弊權衡

索引(Index)是幫助MySQL高效獲取數據數據結構
使用索引前需要創(chuàng)建索引慨绳。

創(chuàng)建索引

普通索引

  • 直接基于表創(chuàng)建:
CREATE INDEX indexName ON table_name(column_name(length)); 
  • 修改表結構創(chuàng)建:
ALTER table table_name ADD INDEX index_name(column_name);
  • 創(chuàng)建表時指定:
CREATE TABLE table_name(
ID INT NOT NULL,
...
INDEX [index_name] (column_name(length))
);

唯一索引

唯一索引的值必須唯一脐雪,但允許多個空值战秋。

  • 直接基于表創(chuàng)建:
REATE UNIQUE INDEX indexName ON table_name(column_name(length)); 
  • 修改表結構創(chuàng)建:
ALTER table table_name ADD UNIQUE index_name(column_name);
  • 創(chuàng)建表時指定:
CREATE TABLE table_name(
ID INT NOT NULL,
...
UNIQUE [index_name] (column_name(length))
);

主鍵索引

主鍵索引是唯一索引的一種讨韭,但主鍵索引不可為空,且一個表只能創(chuàng)建一個主鍵索引狰闪,但可以創(chuàng)建多個唯一索引濒生。另外,主鍵索引可以被其他表引用為外鍵秋泄,但唯一索引不可以恒序。

  • 在創(chuàng)建表的時候指定:
CREATE TABLE table_name(
ID INT NOT NULL,
...
PRIMARY KEY (column_name(length))
);

CREATE TABLE table_name(
ID INT PRIMARY KEY NOT NULL,
...
);
  • 修改表結構指定:
ALTER table table_name ADD PRIMARY KEY (column_name);

例子

score表的score列創(chuàng)建主鍵索引:

mysql> CREATE UNIQUE INDEX score_index ON score(score);
Query OK, 0 rows affected (0.75 sec)

刪除索引

  • 直接刪除
DROP INDEX index_name ON table_name;
  • 修改表結構刪除
ALTER TABLE table_name DROP INDEX index_name;
  • 刪除主鍵
    因為一個表只有一個主鍵谁撼,因此可如下直接刪除主鍵索引
ALTER TABLE table_name DROP PRIMARY KEY;
  • 例子
    刪除剛剛添加的score列的唯一索引:
mysql> DROP INDEX score_index ON score;
Query OK, 0 rows affected (0.34 sec)

刪除score表的主鍵

mysql> ALTER TABLE score DROP PRIMARY KEY;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

因為score表的主鍵厉碟,id列為自增字段箍鼓,自增的字段必須為主鍵,因此刪除主鍵前需要先刪除自增:

mysql> SHOW COLUMNS FROM score;
+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| student_id | int(11) | NO   | MUL | NULL    |                |
| subject_id | int(11) | NO   | MUL | NULL    |                |
| score      | double  | YES  | UNI | NULL    |                |
+------------+---------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql> ALTER TABLE score MODIFY id INT(11); // 刪除自增
Query OK, 5 rows affected (1.97 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SHOW COLUMNS FROM score;
+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| id         | int(11) | NO   | PRI | NULL    |       |
| student_id | int(11) | NO   | MUL | NULL    |       |
| subject_id | int(11) | NO   | MUL | NULL    |       |
| score      | double  | YES  | UNI | NULL    |       |
+------------+---------+------+-----+---------+-------+
4 rows in set (0.01 sec)

再刪除主鍵:

mysql> ALTER TABLE score DROP PRIMARY KEY;
Query OK, 5 rows affected (1.77 sec)

查詢索引

SHOW INDEX FROM table_name;

使用索引

最開始說到索引是幫助MySQL高效獲取數據數據結構,因此索引即是用來快速檢索數據的海洼。

SELECT * FROM table_name WHERE column_name = value;

如我們向上面的column_name列創(chuàng)建了索引后坏逢,當表中數據非常多時,檢索數據的效率會大大高于無索引的情況赘被。

索引的利弊

  • 如剛才說到的是整,索引能夠提高數據檢索的效率,降低數據庫的IO成本民假。
  • 索引能夠降低數據的排序成本贰盗。
    每個索引中的數據都是按照索引鍵鍵值進行排序后存放的,所以在排序分組操作時阳欲,如果排序字段和索引鍵字段剛好一致舵盈, 在取得數據后就不用排序了。因為根據索引取得的數據已經滿足客戶的排序要求球化。

索引是獨立于基礎數據外的一部分數據秽晚,因此索引會消耗存儲空間資源。另外筒愚,基礎數據越多赴蝇,相應的索引也越多,消耗的空間也越多巢掺。就好比圖書館里的書越多句伶,借閱檢索系統的數據也就越多先嬉。

對于創(chuàng)建了索引的列疫蔓,更新該列時酥筝,相應的索引也要更新哀九。這就增加了更新所帶來的 IO 量和調整索引所致的計算量。比如當我們在圖書館借書還書時息裸,借閱檢索系統的數據也要更新。

什么時候創(chuàng)建索引

  • 較為頻繁的作為查詢條件的字段應創(chuàng)建索引
    因為索引就是用來提高數據檢索的效率访圃。
  • 表中數據很多時適合創(chuàng)建索引
    當表中數據較少時饭宾,數據檢索無論有沒有索引都挺快的徽鼎。
  • 唯一性太差的列不適合創(chuàng)建索引
    例如性別列,目前只有‘男’和‘女’檐嚣,每個值都會有成千上萬的值报咳,再創(chuàng)建索引提高檢索效率也沒有意義厢漩。且當索引字段中每個值都含有大量的記錄時架谎,存儲引擎在根據索引訪問數據的時候會帶來大量的隨機IO土全,甚至有些時候還會出現大量的重復IO裹匙。
  • 更新非常頻繁的列不適合創(chuàng)建索引。
    這點由索引的弊端我們即可明白。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末麸塞,一起剝皮案震驚了整個濱河市弧哎,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慌核,死亡現場離奇詭異垫桂,居然都是意外死亡钾怔,警方通過查閱死者的電腦和手機愚臀,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門舶斧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀酷,你說我怎么就攤上這事琉雳【馇眩” “怎么了抓半?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任听皿,我火速辦了婚禮咕别,結果婚禮上,老公的妹妹穿的比我還像新娘篷朵。我一直安慰自己声旺,他們只是感情好腮猖,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布姐赡。 她就那樣靜靜地躺著杖们,像睡著了一般姥饰。 火紅的嫁衣襯著肌膚如雪费什。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天巡球,我揣著相機與錄音言沐,去河邊找鬼。 笑死酣栈,一個胖子當著我的面吹牛险胰,可吹牛的內容都是我干的。 我是一名探鬼主播钉嘹,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鸯乃,長吁一口氣:“原來是場噩夢啊……” “哼鲸阻!你這毒婦竟也來了跋涣?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鸟悴,失蹤者是張志新(化名)和其女友劉穎陈辱,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體细诸,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沛贪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了震贵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片利赋。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猩系,靈堂內的尸體忽然破棺而出媚送,到底是詐尸還是另有隱情,我是刑警寧澤寇甸,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布塘偎,位于F島的核電站疗涉,受9級特大地震影響,放射性物質發(fā)生泄漏吟秩。R本人自食惡果不足惜咱扣,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涵防。 院中可真熱鬧闹伪,春花似錦、人聲如沸壮池。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火窒。三九已至硼补,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熏矿,已是汗流浹背已骇。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留票编,地道東北人褪储。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像慧域,于是被迫代替她去往敵國和親鲤竹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344