索引用於快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間越多,如果表中查詢的列有一個索引,MySQL能快速到達某個位置去搜尋數據文件,而不必查看所有數據。
1索引簡介
數據庫中的索引是某個表中一列或者若干列值的集合,是一個獨立的、物理的數據庫結構,一般是與圖或視圖中的列相關聯,數據庫用戶可以利用索引快速地訪問數據表中的數據信息。通常情況下,只有在需要經常查詢索引列中的數據時,纔在表上創建索引,因爲索引的使用會佔用磁盤的空間,並且降低添加、刪除和更新數據行的速度。
索引是在存儲引擎中實現的,所有存儲引擎支持每個表至少16個索引,MySQL中索引的存儲類型有兩種:BTREE和HASH,具體和表的存儲引擎相關,MyISAM和InnoDB存儲引擎只支持BTREE索引;MEMORY存儲引擎可以支持HASH和BTREE索引。
在數據庫中,索引主要有以下的一些作用:
- 通過創建索引,可以保證數據記錄的唯一性;
- 可以大大加快數據檢索速度;
- 在使用分組或排序子句進行檢索數據時,可以顯著減少查詢中分組和排序的時間。
索引的分類:
普通索引和唯一索引
- 普通索引:基本索引類型,允許在定義索引的列中插入重複值和空值
- 唯一索引:索引列的值必須唯一,但允許有空值,主鍵索引是一種特殊的唯一索引,不允許有空值
單列索引和組合索引
- 單列索引:一個索引值包含單個列,一個表中可以有多個單列索引
- 組合索引:在表的多個字段上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合。
全文索引:全文索引類型爲FULLTEXT,在定義索引的列上支持值的全文查找,允許在這些索引列中插入空值和重複值,全文索引可以在CHAR、VARCHAR或者TEXT類型的列上創建,MySQL中只有MyISAM存儲引擎支持全文索引。
索引的設計原則:
- 索引並非越多越好,索引會影響INSERT、DELETE和UPDATE語句的性能
- 避免對經常更新的表進行過多的索引,索引列應該儘可能減少,對於經常查詢的字段應該創建索引,但是避免添加不必要的字段
數據量小的表最好不要使用索引,此時建立索引並不會優化性能
在條件表達式中經常用到的不同值較多的列上建立索引,在不同值很少的列上不要建立索引
- 靈活使用唯一索引
- 在頻繁進行排序或分組的列上建立索引,可以提升性能
2創建索引
MySQL支持多種方法在單個或多列上創建索引:在創建表的定義語句CREATE TABLE中指定索引,使用ALTER TABLE語句在存在的表上創建索引,或者使用CREATE INDEX語句在已存在的表上添加索引。
創建表的時候創建索引:
create table table_name [col_name data_type] [unique|fulltext|spatial[index|key] [index_name] (column_name,...) [asc|desc];
在已經存在的表上創建索引
使用ALTER TABLE語句創建索引:
alter table table_name add [unique|fulltext|spatial] [index|key] [index_name] (column_name,...) [asc|desc];
使用CREATE INDEX語句創建索引:
create [unique|fulltext|spatial] [index|key] [index_name] on table_name (column_name,...) [asc|desc];
3刪除索引
MySQL中刪除索引使用ALTER TABLE或者DROP INDEX語句。
使用ALTER TABLE刪除索引:
alter table table_name drop index index_name;
使用DROP INDEX刪除索引:
drop index index_name on table_name;