咱們已經知道數據頁的格式是這樣的:
假設咱們要查詢一個名字叫作張三的人,咱們是這樣查的:數據庫
因此這周非索引的,就至關於全表掃描,他會一個個數據頁的每行進行查找。
若是咱們查找主鍵id爲45的數據呢(假設每一個數據頁10條),咱們是這樣查的:spa
這個查找包括了兩個東西,一個是主鍵,是遞增的,因此咱們在定位到數據頁的時候,能夠用二分查找。另一個就是索引,MySql的索引是B+樹結構,索引又分爲聚族索引跟非聚族索引。
索引在磁盤中,也是經過數據頁的形式,因此id=45查找的過程是這樣的:
在最頂層的數據頁中查找,發現45比101還小,因此他就往左邊的數據頁查找。
而後對比45和51,發現比51小,因而就定位數據頁4。
而後在數據頁4中,經過二分查找到45的id。
對於非聚族索引,查找的過程也是相似的,不一樣的他的葉子節點存儲的是索引對應的列的值以及索引的值,因此他還要經過索引的值繼續上面的操做,也就是回表。
既然索引能夠提高查詢效率,那咱們能夠多建幾個索引嗎?
咱們從這幾個來考慮:blog