我們上學的時候,學校會將學生按年級分開,年級又按照班級分開,班級可能又按照組分開。學校為什么要這樣做呢?答案很明顯,方便組織管理。不同的事情,需要不同的組織形式:班級里收集作業可以以小組為單位;年級內組織活動可以以班級為單位;學校里組織考試可以以年級為單位。在面對相同屬性的事物時,通過組織分類可以極大地方便管理工作。同理,計算機中的數據都是以二進制形式存儲,為了更好地組織數據,磁盤以扇區(512B)為最小存儲單位,文件系統(多種文件系統不同)又以塊(4KB)為讀寫數據的最小單位,內存以頁(4KB)為數據的最小存儲單位。mysql中也有頁的概念,並且其大小是16KB.頁是innodb磁盤管理的最小單位。
mysql是以B+樹的數據結構存儲數據的。B+樹只有葉子節點存儲具體數據,非葉子節點只存儲索引。比如我們一行數據的大小為1KB,則1頁可以存儲16條數據。索引列使用bigint類型(8B)再加上索引的其它信息,估算為20B。mysql的第一層存儲索引,161024/20=819.則第一層可以存儲819個索引,第二層可以存儲819819=670761個索引。第三層存儲數據,則可以存儲67076116=10732176條數據。
mysql的第一層是只有一頁,第二層有819頁,第三層有670761頁。這樣我們查找一條數據,最壞的情況也只需要讀3次磁盤。
其實索引並不占多少空間,主要還是數據占空間。上例的索引占空間為(1+819)16KB=13MB.數據占空間為670761*16KB=10G.