注意,本篇內容針對mysql,並且使用innodb儲存引擎,其他儲存引擎對於唯一索引空值的行為不在討論範圍內。
沒注意過這個問題
唯一索引可以允許多個空值,並且你查詢空值時還能用上索引??
下面分析下它咋存的
我檢視了下這個索引頁的資料
把infimum和supremum之間的資料格式化一下,就是索引頁的資料
80 00 00 01 主鍵 1
80 00 00 01 輔助索引列 1
00 00 00 18 00 22 下一列offset
80 00 00 02 主鍵 2
80 00 00 02 輔助索引列 2
01 00 00 20 00 0a 下一列offset
80 00 00 03 主鍵3 輔助索引列為null 沒儲存
01 00 00 28 ff da 下一列offset
下面的一樣
80 00 00 04
00 00 00 30 00 0e
80 00 00 05
80 00 00 05
00 00 00 38 ff b4
80 00 00 06
80 00 00 06
可以看到,非空值的輔助索引都是(主鍵、索引)
的形式,但是空值的索引只有主鍵,就是乙個輔助索引項如果只有主鍵,那麼它的索引列就是空的。所以只需要對索引進行乙個整個的掃瞄,找到這些只儲存了主鍵的專案,它們就是索引列為空的。
看起來,用不用索引並沒有多大差別,因為為空的輔助索引列根本沒被儲存,所以也無法使用b+樹的有序特性來進行索引。
那為什麼innodb還是選擇使用了索引?很簡單,掃瞄索引當然比掃瞄整個表快了,因為輔助索引是非聚集索引,它小的很,肯定比整個表占用更少的磁碟頁,所以能夠掃瞄索引得到的資料就不要進行全表掃瞄。
mysql 唯一索引 mysql建立唯一索引
檢視索引 show index from 資料庫表名 alter table 資料庫add index 索引名稱 資料庫欄位名稱 primary key 主鍵索引 alter table table name add primary key column unique 唯一索引 alter tabl...
MySQL InnoDB索引相關
一般資料庫的資料 資料本身和結構維護資料 最終都是要落地到磁碟上,進行讀取的時候不可能一次性將所有資料全部載入到記憶體,所以記憶體中需要不停的置換磁碟上的內容,索引也是一樣,乙個資料庫的索引佔據的空間也是不小的資料,都是分頁載入的,所以需要合適的資料結構來儲存才能保持較好的效能,b樹就是用來儲存索引...
MongoDB 唯一索引
mongodb支援的索引種類很多,諸如單鍵索引,復合索引,多鍵索引,ttl索引,文字索引,空間地理索引等。同時索引的屬性可以具有唯一性,即唯一索引。唯一索引用於確保索引欄位不儲存重複的值,即強制索引欄位的唯一性。預設情況下,mongodb的 id欄位在建立集合的時候會自動建立乙個唯一索引。本文主要描...