當數據庫中數據量特別大的時候,查詢的速度就比較慢,這時候須要添加索引,來提升查詢速度。mysql
索引的優勢sql
1>經過建立惟一索引,能夠保證數據庫表中每行數據的惟一性。數據庫
2>加快數據查詢速度優化
3>在使用分組和排序進行數據查詢時,能夠顯著的減小查詢中分組和排序的時間spa
索引的缺點排序
1>維護索引須要消耗數據庫資源索引
2>索引須要佔用磁盤空間,索引文件可能會比數據庫文件更快達到文件的最大尺寸資源
3>對錶的數據進行增/刪/改的時候,須要維護索引,因此會影響增/刪/改的速度io
索引的分類table
1.普通索引和惟一索引
主鍵索引是一種特殊的惟一索引,不容許有空值。
2.單索引和複合索引
單索引只包含單個列
複合索引,指在多個字段上建立索引,查詢時,只有使用了第一個索引字段時,其它索引纔會被使用,使用複合索引時遵循最左前綴集合。
3.全文索引
全文索引類型爲fulltext,在定義索引的列上支持值的全文查找,容許這些索引列的值重複且能夠爲空值,全文索引能夠在char、varchar、text類型列上建立。
使用explain,咱們知道mysql如何使用索引來處理select語句以及鏈接表,能夠幫助咱們選擇更好的索引和寫出更優化的查詢語句。以下示例
explain詳解
1.id
它是sql語句執行的順序。如上示例能夠看出先執行外層select,再執行內層select。
2.select_type
它提供了各類「列屬性」引用的類型,最多見的值包括以下
1>simple 表示簡單的select,沒有union和子查詢。
2>primary 最外面的select,在有子查詢的語句中,最外面的select查詢就是primary,如上例子就是
3>union SQL語句中帶有union
4>derived 當查詢的表不是一個物理表時,那麼它就叫作derived。如上示例tt表不是一個物理表
3.table
很明顯,它是查詢所用的表
4.type
表示mysql在表中找到所須要記錄的方式,又稱爲"鏈接類型"或"訪問類型",從最好到最差依次以下
system:表示只有一行記錄(等於查詢系統表)
const:表示表中最多隻有一行匹配的記錄
range:只檢索給定範圍的行,key列顯示使用了哪一個索引。當使用=、>、<、between操做符時,可使用range
index:全表掃描,只是掃描表的時候按照索引次序進行而不是行,主要優勢是避免了排序,可是依然消耗很大的開銷
all:最壞的狀況,從頭至尾全表掃描
5.possible_keys
表示mysql在搜索表記錄時可能會使用哪一個索引。注意,該字段徹底獨立於explain顯示的表順序,所以,possible_keys裏面所包含的索引可能在實際的使用中並無用到,即這個字段的值是null時,就表示沒有索引被用到。
6.key
該字段表示mysql查詢實際使用的索引,當沒有任何索引被用到的時候,該字段值爲null。
7.key_len
該字段表示mysql使用索引的長度,當key字段值爲null時,索引的長度就是null。例如上述例子中,主鍵的長度是int類型,長度爲10,這就至少須要4位來表示,因此索引的長度爲4。
8.ref
該列表示 使用哪一個列或常數與key一塊兒從表中選擇行
9.rows
表示mysql執行查詢的行數,該數值越大,越很差,代表沒有用好索引
10.extra
該字段顯示了mysql查詢過程當中的附加信息,常見信息以下
Using index : 表示mysql使用了覆蓋索引
Using where : 表示mysql在存儲引擎檢索後再進行過濾
Using temporary : 表示mysql對查詢結果排序時會用到一個臨時表
Using filesort : 表示mysql會對結果使用一個外部索引排序,即mysql使用where後面的索引查詢結果,使用order by 後面的索引排序
distinct:mysql找到當前記錄匹配結果的第一條記錄以後,就再也不搜索其餘記錄了
not exists:mysql在查詢時作一個left join優化時,在當前表中找到與前一條記錄符合left join條件以後,就再也不搜索其餘的記錄了。