索引用於快速找到特定一些值的記錄。如果沒有索引,MySQL就必須從第一行記錄開始讀取整個表來檢索記錄。表越大,資源消耗越大。如果在欄位上有索引的話,MySQL就能很快決定該從資料檔案的哪個位置開始搜尋記錄,而無須查詢所有的資料。如果表中有1000條記錄的話,那麼這至少比順序地讀取資料快100倍。注意,如果需要存取幾乎全部1000條記錄的話,那麼順序讀取就更快了,因為這樣會使磁碟搜尋最少。
大部分MySQL索引(PRIMARYKEY,UNIQUE,INDEX和FULLTEXT)都是以B樹方式儲存。只有空間型別的欄位使用R樹儲存,MEMORY(HEAP)表支援雜湊索引。
字串預設都是自動壓縮字首和字尾中的空格。
想要儘快找到匹配WHERE子句的記錄。
根據條件排除記錄。如果有多個索引可共選擇的話,MySQL通常選擇能找到最少記錄的那個索引。
做表連線查詢時從其他表中檢索記錄。
想要在指定的索引欄位key_col上找到它的MIN()或MAX()值。最佳化程式會在檢查索引的
key_col欄位前就先檢查其他索引部分是否使用了WHEREkey_part_#=constant子句。這樣的話,
MySQL會為MIN()或MAX()表示式分別單獨做一次索引查詢,並且將它替換成常數。當所有的表示式都被替換成常數後,查詢就立刻返回。如下:
SELECTMIN(key_part2),MAX(key_part2)FROMtbl_nameWHEREkey_part1=10;
對錶作排序或分組,當在一個可用的最左字首索引上做分組或排序時(如ORDER
BYkey_part1,key_part2)。如果所有的索引部分都按照DESC排序,索引就按倒序排序。
有些時候,查詢可以最佳化使得無需計算資料就能直接取得結果。當查詢使用表中的一個數字型欄位,且這個欄位是索引的最左部分,則可能從索引樹中能很快就取得結果:
SELECTkey_part3FROMtbl_nameWHEREkey_part1=1
假設有如下SELECT語句:
如果在col1和col2上有一個多欄位索引的話,就能直接取得對應的記錄了。
索引用於快速找到特定一些值的記錄。如果沒有索引,MySQL就必須從第一行記錄開始讀取整個表來檢索記錄。表越大,資源消耗越大。如果在欄位上有索引的話,MySQL就能很快決定該從資料檔案的哪個位置開始搜尋記錄,而無須查詢所有的資料。如果表中有1000條記錄的話,那麼這至少比順序地讀取資料快100倍。注意,如果需要存取幾乎全部1000條記錄的話,那麼順序讀取就更快了,因為這樣會使磁碟搜尋最少。
大部分MySQL索引(PRIMARYKEY,UNIQUE,INDEX和FULLTEXT)都是以B樹方式儲存。只有空間型別的欄位使用R樹儲存,MEMORY(HEAP)表支援雜湊索引。
字串預設都是自動壓縮字首和字尾中的空格。
想要儘快找到匹配WHERE子句的記錄。
根據條件排除記錄。如果有多個索引可共選擇的話,MySQL通常選擇能找到最少記錄的那個索引。
做表連線查詢時從其他表中檢索記錄。
想要在指定的索引欄位key_col上找到它的MIN()或MAX()值。最佳化程式會在檢查索引的
key_col欄位前就先檢查其他索引部分是否使用了WHEREkey_part_#=constant子句。這樣的話,
MySQL會為MIN()或MAX()表示式分別單獨做一次索引查詢,並且將它替換成常數。當所有的表示式都被替換成常數後,查詢就立刻返回。如下:
SELECTMIN(key_part2),MAX(key_part2)FROMtbl_nameWHEREkey_part1=10;
對錶作排序或分組,當在一個可用的最左字首索引上做分組或排序時(如ORDER
BYkey_part1,key_part2)。如果所有的索引部分都按照DESC排序,索引就按倒序排序。
有些時候,查詢可以最佳化使得無需計算資料就能直接取得結果。當查詢使用表中的一個數字型欄位,且這個欄位是索引的最左部分,則可能從索引樹中能很快就取得結果:
SELECTkey_part3FROMtbl_nameWHEREkey_part1=1
假設有如下SELECT語句:
如果在col1和col2上有一個多欄位索引的話,就能直接取得對應的記錄了。