mysql索引
什麼是索引
索引(index)是幫助mysql高效獲取資料的資料結構,也就是說索引的本質就是資料結構。
生活中書本的目錄就可以理解為一種索引。
mysql中索引分類聚簇索引(聚集索引): 將資料儲存與索引放到了一塊,找到索引也就找到了資料
非聚簇索引(二級索引):將資料儲存於索引分開結構,索引結構的葉子節點指向了資料的對應行,myisam 通過key_buffer把索引先快取到記憶體中,當需要訪問資料時(通過索引訪問資料),在記憶體中直接搜尋索引,然後通過索引找到磁碟相應資料,這也就是為什麼索引不在key buffer命中時,速度慢的原因。
普通索引:只包含單個列的索引,乙個表中可以有多個普通索引。
唯一索引:索引列的值必須唯一,但允許有空值。
復合索引:包含多個列的索引
字首索引:顧名思義將某一列擷取內容後建立的索引。字首索引能夠有效減小索引檔案大小,提高索引查詢速度。但是字首索引不能用於 order by group by 。
聚簇索引與非聚簇索引
myisam 引擎就是採用非聚簇索引,索引的葉子節點中不存放資料,而儲存著主鍵id和資料儲存的實體地址。對於非非聚簇索引來說,每次通過索引檢索到所需行後,還需要通過葉子節點上的實體地址去磁碟內取資料(回行)消耗時間。為了優化這部分回行取資料的時間,innodb 引擎採用了聚簇索引, 葉子節點 不再存該行對應的位址,而是直接儲存資料。
innodb中,在聚簇索引之上建立的索引稱之為輔助索引(非聚簇索引),輔助索引訪問資料需要二次查詢。像普通索引、復合索引、字首索引、唯一索引(非主鍵)都是輔助索引,輔助索引葉子節點儲存的不再是行的物理位置,而是主鍵值。
由於聚簇索引是將資料與索引結構一起儲存,因此 一張表僅有乙個聚簇索引。
innodb預設對主鍵建立聚簇索引。如果你不指定主鍵,innodb 會用乙個具有唯一且非空值的索引來代替。如果不存在這樣的索引,innodb 會定義乙個 隱藏的主鍵,然後對其建立聚簇索引。一般來說,innodb 會以聚簇索引的形式來儲存實際的資料,它是其它二級索引的基礎。
mysql為什麼建議使用自增主鍵
mysql在底層是以資料頁為單位來儲存資料的,乙個資料頁的大小預設為16k,乙個資料頁存滿了,mysql會申請乙個新的資料頁來儲存資料。
如果主鍵為自增id的話,mysql在寫滿乙個資料頁的時候,直接申請乙個新的資料頁接著寫就可以了。
如果主鍵是非自增id(uuid),為了確保有序,mysql就需要每次將資料插入合適的位置上。為了確保有序(索引是有序的),當往乙個已滿的資料頁插入資料時,mysql會申請乙個新的資料頁,並把上個資料頁中的部分資料挪到新的資料頁上,這就造成了 頁**。
聚簇索引的資料的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那麼對應的資料一定也是相鄰地存放在磁碟上的。如果主鍵不是自增id,那麼可以想像, 它會幹些什麼 ,不斷地調整資料頁 (頁**), 當然也有其他一些措施來減少這些操作,但卻無法徹底避免。但,如果是自增的,那就簡單了,它只需要一頁一頁地寫,索引結構相對緊湊,磁碟碎片少,效率也高。
資料索引自增
b tree 資料結構索引 從這個資料介面上,細細咀嚼了一下索引自增。如果資料id是自增的情況下,可以看上面圖,資料的整合是很整齊的。前面兩層對應的資料是滿的。但是如果id不是自增的情況,那就不是了。從而導致需要更多前兩層的資料。優點 1.自增,趨勢自增,可作為聚集索引,提公升查詢效率2.節省磁碟空...
Oracle 批處理 索引 自增
oracle 得到許多企業的青睞,在企業中處理大批量匯入到b表裡,使用批處理 批處理使用到的資料庫許可權 oba 許可權 資料庫一般連線 private static object executesql org string ssql,object params catch oraclepar.pa...
MySQL 索引自己的理解
索引是儲存引擎用於快速查詢記錄的一種資料結構,常見索引偶b tree索引,hash索引,空間資料索引 r tree 全文索引。b tree索引是mysql和其他資料庫最常見的索引資料結構,由於b tree這種資料結構的特性,可以保持資料有序,是一種平衡樹,在資料庫索引層面應用廣泛,b tree能夠加...