SQL --索引

當數據庫中數據量特別大的時候,查詢的速度就比較慢,這時候須要添加索引,來提升查詢速度。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條件以後,就再也不搜索其餘的記錄了。

相關文章
相關標籤/搜索