數據庫索引 + 執行計劃

基本概念

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章