索引是一個單獨的、物理的數據庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。
優點:
大大加快數據的檢索速度;
創建唯一性索引,保證數據庫表中每一行數據的唯一性;
加速表和表之間的連接;
在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。
缺點:
索引需要佔物理空間
當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。
更好的理解索引的提示:
ü如果經常使用表中的某一列或某幾列爲條件進行查詢,且表中的數據量比較大時,可以創建索引,以提高查詢的速度。
ü 索引是與表關聯的可選結構。
ü 通過有目的的創建索引,可以加快對錶執行SELECT語句的速度。
ü 不管索引是否存在,都無需修改任何SQL語句的書寫方式。索引只是一種快速訪問數據的途徑,它隻影響查詢執行的效率。
ü 可以使用CREATE INDEX命令在一列或若干列的組合上創建索引。
ü 創建索引時,將獲取要創建索引的列,並對其進行排序。然後,將一個指針連同每一行的索引值存儲起來,組成鍵值對(目錄名和頁碼)。使用索引時,系統首先通過已排序的列值執行快速搜索,然後使用相關聯的指針值來定位具有所要查找值的行。
ü 一旦創建了索引,MySQL會自動維護和使用它們。
ü 只要修改了數據,如添加新行、更新現有行或刪除行, MySQL都會自動更新索引。
ü 但是爲表創建過多的索引會降低更新、刪除以及插入的性能,因爲MySQL還必須更新與該表關聯的索引。
索引的分類
普通索引:這是最基本的索引,它沒有任何限制
唯一索引:它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一
主鍵索引(通過主鍵約束間接創建):它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引
組合索引:在表中的多個列上創建的索引。組合索引中列的順序是任意的,可以是相鄰的列,也可以是不相鄰的列。
索引的創建:
普通(唯一)索引的創建:
CREATE [UNIQUE] INDEX index_name ON tbl_name(index_col_name,…)
index_col_name: col_name[(length)][ASC|DESC]
對於字符類型的列,可以編制“前綴索引”,Length表示按照列的指定長度的字符串索引
創建組合索引:
CREATE INDEX index_name ON tbl_name(index_col_name1,index_col_name2,..)
基於(列A,列B)兩列創建索引:
可應用索引的情況:A;AB兩列結合;
不可用索引的情況:B
Create index index_name on table_name(列A,列B);
其他創建索引的方式:
創建表時創建索引:
CREATE TABLE tbl_name
(
列的定義,……,
INDEX|KEY [idx_name](index_col_name)
);
Eg:
CREATE TABLE t1
(tid int primary key, #既創建約束,又創建索引
tname varchar(20),
index idx_tname(tname), #創建一個普通索引
tbirthday date
);
修改表時創建索引:
ALTER TABLE tbl_name ADD INDEX|KEY [idx_name](indxe_col_name);
Eg:
ALTER TABLE t1 ADD KEY (tbirthday);
查看索引:Show index|keys from 表名;(SHOW KEYS FROM t1;)
刪除索引:drop index 索引名 on 表名。(drop index c on t3;)