一般狀況下,創建索引是加快查詢速度的有效手段。但索引不是萬能的,靠索 引並不能實現對全部數據的快速存取。事實上,若是索引策略和數據檢索需求嚴重不符的話,創建索引反而會下降查詢性能。所以在實際使用當中,應該充分考慮到 索引的開銷,包括磁盤空間的開銷及處理開銷(如資源競爭和加鎖)。例如,若是數據頻繁的更新或刪加,就不宜創建索引。算法
二、從表中刪除數據行數據庫
對刪除數據行來講:刪除行將致使其下方的數據行向上移動以填充刪除記錄形成的空白。若是刪除的行是該數據頁中的最後一行,那麼該數據頁將被回收,相應的索 引頁中的記錄將被刪除。對於數據的刪除操做,可能致使索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的「索引 合併」。ide
不知從什麼角度來對比,只能說說各自的特色,但願對你有用。
一、聚簇索引
a) 一個索引項直接對應實際數據記錄的存儲頁,可謂「直達」
b) 主鍵缺省使用它
c) 索引項的排序和數據行的存儲排序徹底一致,利用這一點,想修改數據的存儲順序,能夠經過改變主鍵的方法(撤銷原有主鍵,另找也能知足主鍵要求的一個字段或一組字段,重建主鍵)
d) 一個表只能有一個聚簇索引(理由:數據一旦存儲,順序只能有一種)
二、非聚簇索引
a) 不能「直達」,可能鏈式地訪問多級頁表後,才能定位到數據頁
b) 一個表能夠有多個非聚簇索引
第二種理解:
聚簇索引是對磁盤上實際數據從新組織以按指定的一個或多個列的值排序的算法。特色是存儲數據的順序和索引順序一致。
通常狀況下主鍵會默認建立聚簇索引,且一張表只容許存在一個聚簇索引。佈局
在《數據庫原理》一書中是這麼解釋聚簇索引和非聚簇索引的區別的:
聚簇索引的葉子節點就是數據節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應數據塊的指針。性能
所以,MYSQL中不一樣的數據存儲引擎對聚簇索引的支持不一樣就很好解釋了。
下面,咱們能夠看一下MYSQL中MYISAM和INNODB兩種引擎的索引結構。spa
如原始數據爲:
MyISAM引擎的數據存儲方式如圖:
指針
MYISAM是按列值與行號來組織索引的。它的葉子節點中保存的其實是指向存放數據的物理塊的指針。
從MYISAM存儲的物理文件咱們能看出,MYISAM引擎的索引文件(.MYI)和數據文件(.MYD)是相互獨立的。orm
而InnoDB按聚簇索引的形式存儲數據,因此它的數據佈局有着很大的不一樣。它存儲數據的結構大體以下:
注:聚簇索引中的每一個葉子節點包含主鍵值、事務ID、回滾指針(rollback pointer用於事務和MVCC)和餘下的列(如col2)。htm
INNODB的二級索引與主鍵索引有很大的不一樣。InnoDB的二級索引的葉子包含主鍵值,而不是行指針(row pointers),這減少了移動數據或者數據頁面分裂時維護二級索引的開銷,由於InnoDB不須要更新索引的行指針。其結構大體以下:
排序
INNODB和MYISAM的主鍵索引與二級索引的對比:
InnoDB的的二級索引的葉子節點存放的是KEY字段加主鍵值。所以,經過二級索引查詢首先查到是主鍵值,而後InnoDB再根據查到的主鍵值經過主鍵 索引找到相應的數據塊。而MyISAM的二級索引葉子節點存放的仍是列值與行號的組合,葉子節點中保存的是數據的物理地址。因此能夠看出MYISAM的主 鍵索引和二級索引沒有任何區別,主鍵索引僅僅只是一個叫作PRIMARY的惟1、非空的索引,且MYISAM引擎中能夠不設主鍵