首先,我們看看這兩個的查詢效能差別。
唯一索引上的欄位的資料只能是唯一的,而普通索引可以有重複資料。
題外話:非主鍵索引是會通過回表來多一次查詢過程(唯一索引也是非主鍵索引)。
例如 SELECT * FROM user WHERE k=5 這條語句
- 對於普通索引來說,k是普通索引的話,會在普通索引上面找出滿足條件的值,找到之後會繼續往下找。
- 對於唯一索引來說,會在索引上面找出滿足條件的值後就停止不繼續往下,因為這行資料是唯一的。
從字面上看的話,這兩者之間差距很大,因為唯一索引每次都是第一次就確定要的資料,但其實在內部的設計中,這兩者之間差距並不是很大。
為什麼呢?因為MySQL是有個緩衝池的,它是通過預讀(Read-Ahead)將磁碟裡面的資料一頁頁的存入記憶體中,每頁資料大概有16KB。
也就是說,當需要讀一條記錄的時候,並不是將這個記錄本身從磁碟讀出來,而是以頁為單位,將其整體讀入記憶體。而因為是按頁讀寫的,所以k=5這行資料就在記憶體中了, 對於普通索引多做的“繼續往下尋找”就並不會很慢。
本作品採用《CC 協議》,轉載必須註明作者和本文連結