1. 程式人生 > 其它 >ubuntu下 pthread_mutex_init man中查不到

ubuntu下 pthread_mutex_init man中查不到



1. myisam 和 innodb 的區別

  1. 事務方面

    innodb 支援事務,myisam 不支援事務

  2. 外來鍵方面

    innodb 支援外來鍵,而 myisam 不支援。對一個包含外來鍵的 innodb 錶轉為 myisam 會失敗。

  3. 索引層面

    innodb 是聚簇索引,myisam 是非聚簇索引。

    myisam 支援 fulltext型別的全文索引, innodb 不支援 FULLTEXT 型別的全文索引,但是 innodb 可以使用 sphinx 外掛支援全文索引,並且效果更好。

  4. 鎖粒度方面

    innodb 最小的鎖粒度是行鎖,myisam 最小的鎖粒度是表鎖。

    一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此併發訪問受限。

  5. 硬碟儲存結構

    myisam 在磁碟上儲存成三個檔案

    • .frm檔案儲存表的定義。
    • 資料檔案的擴 展名為.MYD (MYData)。
    • 索引檔案的擴 展名是.MYI (MYIndex)。

    innodb 儲存引擎儲存資料庫資料,一共有兩個檔案(沒有專門儲存資料的檔案):

    • Frm檔案:表的定義檔案。
    • Ibd檔案:資料和索引儲存檔案。資料以主鍵進行聚集儲存,把真正的資料儲存在葉子節點中。

2. 局簇索引和非局簇索引的區別

  1. 聚簇索引(innodb)

    將資料儲存與索引放到了一塊,索引結構的葉子節點儲存了行資料。

    表資料按照索引的順序來儲存的,也就是說索引項的順序與表中記錄的物理順序一致。

    innodb 中,在聚簇索引之上建立的索引稱之為輔助索引,像複合索引、字首索引、唯一索引等等。

    • 聚簇索引預設是主鍵,
    • 如果表中沒有定義主鍵,innodb 會選擇一個唯一的非空索引代替。
    • 如果沒有這樣的索引,innodb 會在內部生成一個名為 GEN_CLUST_INDEX 的隱式的聚簇索引。
  2. 非聚簇索引(MyISAM)

    將資料與索引分開儲存,表資料儲存順序與索引順序無關


2. 索引查詢過程

  1. 非聚簇索引儲存結構(MyISAM)

    image
    MyISAM的 B+樹 的葉子節點上,記錄的是真實資料的儲存地址。

    比如通過主鍵id查詢,MyISAM查詢流程如下:

    • 根據id值在B+樹上找到相應的葉子節點
    • 取出葉子節點上的資料儲存地址
    • 根據資料儲存地址,去找到相應的真實資料

    通過主鍵id查詢的時候,InnoDB比MyIsam快一些,因為InnoDB只需要一次B+樹查詢就能取出資料。MyIsam通過B+樹查詢到地址後,還需要根據地址去查詢真正的資料

    還比如說在資料重構的時候,MyIsam記錄的是資料地址,那麼重構資料的時候地址就要重新生成一遍,這也是有問題的。

    InnoDB重構資料的時候就不會這樣,因為他記錄的是主鍵id,地址會變化,主鍵id是不會變的。

  2. 聚簇索引儲存結構(innodb)

    image
    InnoDB的 B+樹 的葉子節點上,記錄的是真實行資料。

    比如通過主鍵id查詢,InnoDB查詢流程如下:

    聚簇索引(主鍵索引):

    • 根據id值在B+樹上找到相應的葉子節點
    • 取出葉子節點上的行資料,返回即可

    輔助索引(聚簇索引以外的):

    • 在相應索引的B+樹上找到相應的葉子節點
    • 取出葉子節點上的資料,該資料是主鍵id
    • 拿到主鍵id後,去主鍵索引的B+樹上找到相應的葉子節點
    • 取出葉子節點上的行資料,返回