基本概念
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息(From 百科)
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。
其實可以這麼理解,索引就等於是字典的查詢目錄,你是在字海里查東西快還是通過查詢目錄來查詢快呢,顯而易見。
索引種類:聚簇索引和非聚簇索引,聚簇索引是按照數據存放的物理位置爲順序的。
注意:不是說索引越多就越好,索引會增加插入和更新表的開銷,對於經常要插入和更新缺很少查詢的表,建議不設置索引,所以具體情況需要具體分析。
索引介紹
普通索引
關鍵字:index
------------------index-------------------
CREATE INDEX index_name ON table_name(column_name(length))
ALTER TABLE table_name ADD INDEX index_name ON (column_name)
唯一索引
關鍵字:unique index;
與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)。如果是組合索引,則列值的組合必須唯一,創建方法和普通索引類似
----------------------index-----------------------------
CREATE UNIQUE INDEX index_name ON table_name(column_name)
ALTER TABLE table_name ADD UNIQUE index_name ON (column_name)
----------------------create-----------------------
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) NOT NULL ,
PRIMARY KEY (`id`),
UNIQUE index_name (title)
);
主鍵索引
關鍵字:primary key
必須爲主鍵創建的唯一索引。、
PRIMARY KEY (`id`),
全文索引
關鍵字:FULLTEXT
作用於CHAR、VARCHAR或TEXT,如果數據量大,建立索引耗時很嚴重。
-------------------FULLTEXT-------------------------------
ALTER TABLE table_name ADD FULLTEXT index_name(column_name)
CREATE FULLTEXT INDEX index_name ON table_name (column_name)
組合索引
關鍵字:index
建立多個字段的一起查詢的索引。建立索引遵從最左前綴原理,就是從最左邊開始組合。
ALTER TABLE article ADD INDEX index_mul(first(20),second(20))
實際上的索引是:
first
first,second
最左前綴原理
索引優化
索引經驗值
動作描述 | 聚集索引 | 非聚集索引 |
---|---|---|
列經常被分組排序 | 使用 | 使用 |
返回某範圍內的數據 | 使用 | 不使用 |
一個或極少不同值 | 不使用 | 不使用 |
小數目的不同值 | 使用 | 不使用 |
大數目的不同值 | 不使用 | 使用 |
頻繁更新的列 | 不使用 | 使用 |
外鍵列 | 使用 | 使用 |
列經常被分組排序 | 使用 | 使用 |
主鍵列 | 不使用 | 使用 |
最好不要有NULL值
只要列中包含有NULL值都將不會被包含在索引中。複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。
短索引
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
索引排序
MYSQL只會使用一次索引,where使用了索引的話,order by就不會使用索引。
不要再字段上進行運算
在字段上運算會導致索引失效。
like 語句操作
like %xx%會使索引失效,因爲最左前綴原因。like xx%則不會失效。
索引生效的操作
<,<=,=,>,>=,between,in,以及某些時候的like(不以通配符%或_開頭的情形)
執行計劃
數據庫中,使用explan命令就可以查看詳細的sql語句的執行詳情,稱爲執行計劃
舉例:
explain select * from xxx where xxx=xxx
返回的結果如下(只做簡介)
id:查詢的序列號,越大表明越先執行。
select_type:查詢的類型,主要區別普通查詢和聯合查詢等:
table:輸出的行所引用的表,尖括號括起來表明是臨時表。
type:查詢的類型,表明是否使用了索引,和使用了什麼索引。
possible_key:查詢時可能使用到的索引。
key:查詢時真正使用的索引。
key_len:使用索引的長度,所有使用到的索引的總長度
ref:常數等值查詢,這裏會顯示const,如果是連接查詢,被驅動表的執行計劃這裏會顯示驅動表的關聯字段
rows:估算的掃描行數。
Extra:擴展字段,可顯示的信息非常多。
可參考的資料:http://www.cnblogs.com/xiaoboluo768/p/5400990.html