ubuntu下 pthread_mutex_init man中查不到
1. myisam 和 innodb 的區別
-
事務方面
innodb 支援事務,myisam 不支援事務
-
外來鍵方面
innodb 支援外來鍵,而 myisam 不支援。對一個包含外來鍵的 innodb 錶轉為 myisam 會失敗。
-
索引層面
innodb 是聚簇索引,myisam 是非聚簇索引。
myisam 支援 fulltext型別的全文索引, innodb 不支援 FULLTEXT 型別的全文索引,但是 innodb 可以使用 sphinx 外掛支援全文索引,並且效果更好。
-
鎖粒度方面
innodb 最小的鎖粒度是行鎖,myisam 最小的鎖粒度是表鎖。
一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此併發訪問受限。
-
硬碟儲存結構
myisam 在磁碟上儲存成三個檔案
- .frm檔案儲存表的定義。
- 資料檔案的擴 展名為.MYD (MYData)。
- 索引檔案的擴 展名是.MYI (MYIndex)。
innodb 儲存引擎儲存資料庫資料,一共有兩個檔案(沒有專門儲存資料的檔案):
- Frm檔案:表的定義檔案。
- Ibd檔案:資料和索引儲存檔案。資料以主鍵進行聚集儲存,把真正的資料儲存在葉子節點中。
2. 局簇索引和非局簇索引的區別
-
聚簇索引(innodb)
將資料儲存與索引放到了一塊,索引結構的葉子節點儲存了行資料。
表資料按照索引的順序來儲存的,也就是說索引項的順序與表中記錄的物理順序一致。
innodb 中,在聚簇索引之上建立的索引稱之為輔助索引,像複合索引、字首索引、唯一索引等等。
- 聚簇索引預設是主鍵,
- 如果表中沒有定義主鍵,innodb 會選擇一個唯一的非空索引代替。
- 如果沒有這樣的索引,innodb 會在內部生成一個名為 GEN_CLUST_INDEX 的隱式的聚簇索引。
-
非聚簇索引(MyISAM)
將資料與索引分開儲存,表資料儲存順序與索引順序無關
2. 索引查詢過程
-
非聚簇索引儲存結構(MyISAM)
MyISAM的 B+樹 的葉子節點上,記錄的是真實資料的儲存地址。比如通過主鍵id查詢,MyISAM查詢流程如下:
- 根據id值在B+樹上找到相應的葉子節點
- 取出葉子節點上的資料儲存地址
- 根據資料儲存地址,去找到相應的真實資料
通過主鍵id查詢的時候,InnoDB比MyIsam快一些,因為InnoDB只需要一次B+樹查詢就能取出資料。MyIsam通過B+樹查詢到地址後,還需要根據地址去查詢真正的資料
還比如說在資料重構的時候,MyIsam記錄的是資料地址,那麼重構資料的時候地址就要重新生成一遍,這也是有問題的。
InnoDB重構資料的時候就不會這樣,因為他記錄的是主鍵id,地址會變化,主鍵id是不會變的。
-
聚簇索引儲存結構(innodb)
InnoDB的 B+樹 的葉子節點上,記錄的是真實行資料。比如通過主鍵id查詢,InnoDB查詢流程如下:
聚簇索引(主鍵索引):
- 根據id值在B+樹上找到相應的葉子節點
- 取出葉子節點上的行資料,返回即可
輔助索引(聚簇索引以外的):
- 在相應索引的B+樹上找到相應的葉子節點
- 取出葉子節點上的資料,該資料是主鍵id
- 拿到主鍵id後,去主鍵索引的B+樹上找到相應的葉子節點
- 取出葉子節點上的行資料,返回