索引是在存儲引擎中實現(xiàn)的,而不是在服務器層中實現(xiàn)的拓挥。所以唠梨,每種存儲引擎的索引都不一定完全相同,并不是所有的存儲引擎都支持所有的索引類型侥啤。下面來詳細總結一下MySQL索引当叭。
MySQL索引的類型有一下幾種:
第一、普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數(shù)據(jù)的訪問速度盖灸。因此蚁鳖,應該只為那些最經常出現(xiàn)在查詢條件(WHERE column = …)或排序條件(ORDER BY column)中的數(shù)據(jù)列創(chuàng)建索引。
ALTER TABLE `t_user` ADD INDEX `idx_user_username` (`username`);
第二赁炎、唯一索引
唯一索引的值必須唯一醉箕,但允許有空值。如果是組合索引,則列值的組合必須唯一讥裤。
ALTER TABLE `t_user` ADD UNIQUE `idx_user_username` (`username`);
第三放棒、主鍵索引
主鍵索引是一種特殊的唯一索引,不允許有空值坞琴,一般是在建表的時候同時創(chuàng)建主鍵索引哨查。
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
`username` varchar(16) NOT NULL COMMENT '用戶名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶';
第四、組合索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
city VARCHAR(50) NOT NULL,
age INT NOT NULL
);
為了進一步榨取MySQL的效率剧辐,就要考慮建立組合索引寒亥。就是將 username, city, age 建到一個索引里。
ALTER TABLE mytable ADD INDEX name_city_age (username(10), city, age);
建表時荧关,usernname 長度為 16溉奕,這里用 10。這是因為一般情況下名字的長度不會超過 10忍啤,這樣會加速索引查詢速度加勤,還會減少索引文件的大小,提高 INSERT 的更新速度同波。建立這樣的組合索引鳄梅,其實是相當于分別建立了下面三組組合索引:
usernname, city, age
usernname, city
usernname
為什么沒有 city, age 這樣的組合索引呢?這是因為 MySQL 組合索引“最左前綴”的結果。簡單的理解就是只從最左面的開始組合未檩。并不是只要包含這三列的查詢都會用到該組合索引戴尸,下面的幾個 SQL 就會用到這個組合索引:
SELECT * FROM mytable WHREE username="admin" AND city="長春"
SELECT * FROM mytable WHREE username="admin"
而下面幾個則不會用到:
SELECT * FROM mytable WHREE age=20 AND city="長春"
SELECT * FROM mytable WHREE city="長春"
如果分別在 usernname, city, age 上建立單列索引,讓該表有3個單列索引冤狡,查詢時和上述的組合索引效率也會大不一樣孙蒙,遠遠低于我們的組合索引。雖然此時有了三個索引悲雳,但 MySQL 只能用到其中的那個它認為似乎是最有效率的單列索引挎峦。
MySQL使用索引的優(yōu)缺點總結:
?使用索引的優(yōu)點
1.可以通過建立唯一索引或者主鍵索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
2.建立索引可以大大提高檢索的數(shù)據(jù),以及減少表的檢索行數(shù)合瓢。
3.在表連接的連接條件 可以加速表與表直接的相連坦胶。
4.在分組和排序字句進行數(shù)據(jù)檢索,可以減少查詢時間中 分組 和 排序時所消耗的時間(數(shù)據(jù)庫的記錄會重新排序)。
5.建立索引,在查詢中使用索引 可以提高性能晴楔。
使用索引的缺點
1.在創(chuàng)建索引和維護索引 會耗費時間,隨著數(shù)據(jù)量的增加而增加迁央。
2.索引文件會占用物理空間,除了數(shù)據(jù)表需要占用物理空間之外,每一個索引還會占用一定的物理空間。
3.當對表的數(shù)據(jù)進行 INSERT,UPDATE,DELETE 的時候,索引也要動態(tài)的維護,這樣就會降低數(shù)據(jù)的維護速度,(建立索引會占用磁盤空間的索引文件滥崩。一般情況這個問題不太嚴重岖圈,但如果你在一個大表上創(chuàng)建了多種組合索引,索引文件的會膨脹很快)钙皮。
最后告訴大家使用索引需要注意的地方
在建立索引的時候應該考慮索引應該建立在數(shù)據(jù)庫表中的某些列上面 哪一些索引需要建立,哪一些所以是多余的蜂科,一般來說:
1.在經常需要搜索的列上,可以加快索引的速度顽决。
2.主鍵列上可以確保列的唯一性。
3.在表與表的而連接條件上加上索引,可以加快連接查詢的速度导匣。
4.在經常需要排序(order by),分組(group by)和的distinct 列上加索引 可以加快排序查詢的時間, (單獨order by 用不了索引才菠,索引考慮加where 或加limit)。
5.在一些where 之后的 <, <= ,> ,>= ,BETWEEN ,IN 以及某個情況下的like 建立字段的索引(B-TREE)贡定。
6.like語句的 如果你對nickname字段建立了一個索引.當查詢的時候的語句是 nickname lick '%ABC%' 那么這個索引講不會起到作用.而nickname lick 'ABC%' 那么將可以用到索引赋访。
7.索引不會包含NULL列,如果列中包含NULL值都將不會被包含在索引中,復合索引中如果有一列含有NULL值那么這個組合索引都將失效,一般需要給默認值0或者 ' '字符串。
8.使用短索引,如果你的一個字段是Char(32)或者int(32),在創(chuàng)建索引的時候指定前綴長度 比如前10個字符 (前提是多數(shù)值是唯一的..)那么短索引可以提高查詢速度,并且可以減少磁盤的空間,也可以減少I/0操作缓待。
9.不要在列上進行運算,這樣會使得mysql索引失效,也會進行全表掃描蚓耽。
10.選擇越小的數(shù)據(jù)類型越好,因為通常越小的數(shù)據(jù)類型通常在磁盤,內存,cpu,緩存中 占用的空間很少,處理起來更快。