MySQL 新增索引,刪除索引及其用法
一.索引的作用
一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。
在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的時候,就會發現mysql變慢,甚至down掉,這就必須要考慮優化sql了,給資料庫建立正確合理的索引,是mysql優化的一個重要手段。
索引的目的在於提高查詢效率,可以類比字典,如果要查“mysql”這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要把所有單詞看一遍才能找到你想要的。除了詞典,生活中隨處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查詢方式來鎖定資料。
在建立索引時,需要考慮哪些列會用於 SQL 查詢,然後為這些列建立一個或多個索引。事實上,索引也是一種表,儲存著主鍵或索引欄位,以及一個能將每個記錄指向實際表的指標。資料庫使用者是看不到索引的,它們只是用來加速查詢的。資料庫搜尋引擎使用索引來快速定位記錄。
INSERT 與 UPDATE 語句在擁有索引的表中執行會花費更多的時間,而SELECT 語句卻會執行得更快。這是因為,在進行插入或更新時,資料庫也需要插入或更新索引值。
二.索引的建立、刪除
索引的型別:
- UNIQUE(唯一索引):不可以出現相同的值,可以有NULL值
- INDEX(普通索引):允許出現相同的索引內容
- PROMARY KEY(主鍵索引):不允許出現相同的值
- fulltext index(全文索引):可以針對值中的某個單詞,但效率確實不敢恭維
- 組合索引:實質上是將多個欄位建到一個索引裡,列值的組合必須唯一
(1)使用ALTER TABLE語句建立索性
應用於表建立完畢之後再新增。
ALTER TABLE 表名 ADD 索引型別 (unique,primary key,fulltext,index)[索引名](欄位名)
1 //普通索引 2 alter table table_name add index index_name (column_list) ; 3 //唯一索引 4 alter table table_name add unique (column_list) ;5 //主鍵索引 6 alter table table_name add primary key (column_list) ;
ALTER TABLE可用於建立普通索引、UNIQUE索引和PRIMARY KEY索引3種索引格式,table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。索引名index_name可選,預設時,MySQL將根據第一個索引列賦一個名稱。另外,ALTER TABLE允許在單個語句中更改多個表,因此可以同時建立多個索引。
(2)使用CREATE INDEX語句對錶增加索引
CREATE INDEX可用於對錶增加普通索引或UNIQUE索引,可用於建表時建立索引。
1 CREATE INDEX index_name ON table_name(username(length));
如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。
1 //create只能新增這兩種索引; 2 CREATE INDEX index_name ON table_name (column_list) 3 CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有與ALTER TABLE語句中相同的含義,索引名不可選。另外,不能用CREATE INDEX語句建立PRIMARY KEY索引。
(3)刪除索引
刪除索引可以使用ALTER TABLE或DROP INDEX語句來實現。DROP INDEX可以在ALTER TABLE內部作為一條語句處理,其格式如下:
1 drop index index_name on table_name ; 2 3 alter table table_name drop index index_name ; 4 5 alter table table_name drop primary key ;
其中,在前面的兩條語句中,都刪除了table_name中的索引index_name。而在最後一條語句中,只在刪除PRIMARY KEY索引中使用,因為一個表只可能有一個PRIMARY KEY索引,因此不需要指定索引名。如果沒有建立PRIMARY KEY索引,但表具有一個或多個UNIQUE索引,則MySQL將刪除第一個UNIQUE索引。
如果從表中刪除某列,則索引會受影響。對於多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。