MySQL性能調(diào)優(yōu)不僅是開發(fā)過程中的一個不可或缺的環(huán)節(jié),也是面試官很愛問的一個部分。
索引是MySQL里一個很重要的部分。
索引是什么
索引可以簡單地理解為“排好序的快速查找數(shù)據(jù)結(jié)構(gòu)”
一般來說索引本身業(yè)很大,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲在磁盤上
我們平時所說的索引,沒有特別指明,都是B樹(多路搜索樹)結(jié)構(gòu)組織的索引。其中聚集索引,次要索引,復(fù)合索引,前綴索引,唯一索引默認(rèn)都是使用B+樹索引,統(tǒng)稱索引。當(dāng)然,除了B+樹這種類型的索引之外,還有哈希索引等
索引的優(yōu)勢
- 類似大學(xué)圖書館數(shù)目索引,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的IO成本
- 通過索引對數(shù)據(jù)進行排序,降低數(shù)據(jù)排序的成本,降低了CPU的消耗
索引的劣勢
- 實際上索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄,索引索引列也是要占空間的
- 雖然buoying大大提高了初旬速度,同時卻會降低更新表的速度(INSERT,UPDATE,DELETE)
- 索引只是提高效率的一個因素,如果你的MYSQL有大數(shù)據(jù)的表,就需要話時間研究簡歷最優(yōu)秀的索引,或優(yōu)化查詢
索引的分類
- 單值索引
即一個索引只包含單個列,一個表可以有多個單列索引,最多不要超過五個 - 唯一索引
索引列的值必須唯一,但允許有空值 - 復(fù)合索引
即一個索引包多個列
基本語法
- 創(chuàng)建
CREATE [UNIQUE] INDEX idnex_name ON tbl_name(column_name(length));
ALTER tbl_name ADD [UNIQUE] INDEX[index_name] ON (column_name(length)); - 刪除
DROP INDEX [indexName] ON tbl_name; - 查看
SHOW INDEX FROM tbl_name; - 使用ALTER命令
4.1 ALTER TABLE tbl_name ADD PRIMARY KEY(columu_name);該語句添加愛一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
4.2 ALTER TABLE tbl_name ADD UNIQUE index_name(olumu_name);這條語句創(chuàng)建的索引的值必須是唯一的(除了NULL外,NULL可能會出現(xiàn)多次)。
4.3 ALTER TABLE tbl_name ADD INDEX index_name(olumu_name);添加普通索引,索引值可出現(xiàn)多次。
4.4 ALTER TABLE tbl_name ADD FULLTEXT index_name(olumu_name);該語句指定了索引為FULLTEXT,用于全文索引。
哪些情況需要創(chuàng)建索引
- 主鍵自動建立唯一索引
- 品份作為查詢條件的字段應(yīng)該創(chuàng)建索引
- 查詢中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引
- 頻繁更新的字段不適合創(chuàng)建索引
- Where條件里不用不到的字段不創(chuàng)建索引
- 單鍵/組合索引的選擇問題(在高并發(fā)下傾向創(chuàng)建組合索引)
- 查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
- 查詢中統(tǒng)計或者分組字段
哪些情況不需要創(chuàng)建索引
- 表的記錄太少
- 經(jīng)常增刪改的表
- 數(shù)據(jù)重復(fù)且分布平均的,某個數(shù)據(jù)列包含許多重復(fù)內(nèi)容的,建立索引就沒有太大的實際效果