亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL 中 InnoDB 和 MyISAM 的區別是什么

發布時間:2021-08-06 11:12:27 來源:億速云 閱讀:162 作者:Leah 欄目:數據庫

今天就跟大家聊聊有關MySQL 中 InnoDB 和 MyISAM 的區別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

  InnoDB 和 MyISAM 之間的聯系和區別

  數據庫存儲引擎

  數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。

  如何知道自己的數據庫用的什么引擎呢?

  SHOW ENGINES;

  我們可以看出數據庫為我們提供了非常多的存儲引擎,從表中看出,InnoDB 的 Support 列是 DEFAULT,表明在我的數據庫服務器上,InnoDB 是默認的數據庫引擎,不過 MySQL 對于多引擎有很好的兼容,一個數據庫服務器上不同的數據庫完全可以使用不同的數據引擎,甚至一個數據庫中的多個表也可以使用不同的引擎。

  從一些文檔中我們可以總結出這兩個引擎的一些差異:

  InnoDB 支持事務,MyISAM 不支持,對于 InnoDB 每一條 SQL 語句都默認封裝成事務進行提交,這樣就會影響速度,優化速度的方式是將多條 SQL 語句放在 begin 和 commit 之間,組成一個事務;

  InnoDB 支持外鍵,而 MyISAM 不支持。

  所以如果一個表修改要求比較高的事務處理,可以選擇 InnoDB。這個數據庫中可以將查詢要求比較高的表選擇 MyISAM 存儲。如果該數據庫需要一個用于查詢的臨時表,甚至可以考慮選擇 MEMORY 存儲引擎。

  但是為什么 InnoDB 和 MyISAM 之間會有這些差異呢?我們需要了解一下對應的儲存引擎的底層原理。

  存儲引擎原理

  首先針對可能面試會問到的問題「MyISAM 和 InnoDB 兩種引擎所使用的索引的數據結構是什么」做一個回答:

  都是 B+ 樹,不過區別在于:

  MyISAM 中 B+ 樹的數據結構存儲的內容是實際數據的地址值,它的索引和實際數據是分開的,只不過使用索引指向了實際數據。這種索引的模式被稱為非聚集索引。

  InnoDB 中 B+ 樹的數據結構中存儲的都是實際的數據,這種索引有被稱為聚集索引。

  B 樹和 B+ 樹

  那么什么是 B+ 樹?

  B+ 樹是 B 樹的一個變種,對于 B 樹來說:

  B 樹屬于多叉樹又名平衡多路查找樹,其規則是:

  所有節點關鍵字是按遞增次序排列,并遵循左小右大原則

  子節點數:非葉節點的子節點數>1,且<=m m="">=2,空樹除外(注:M階代表一個樹節點最多有多少個查找路徑,M=M 路,當 M=2 則是 2 叉樹,M=3 則是 3 叉)

  關鍵字數:枝節點的關鍵字數量大于等于 ceil(m/2)-1 個且小于等于 M-1 個(注:ceil() 是個朝正無窮方向取整的函數 如 ceil(1.1)結果為 2)

  葉節點的指針為空且葉節點具有相同的深度

  而對于 B+ 樹:

  B+ 樹是 B 樹的一個升級版,相對于 B 樹來說 B+ 樹更充分的利用了節點的空間,讓查詢速度更加穩定,其速度完全接近于二分法查找。

  一個 B+ 樹的 C++ 定義類似如下:

  class BPTree; //self explanatory classes

  class Node

  {

  bool IS_LEAF;

  int *key, size;

  Node** ptr;

  friend class BPTree;

  public:

  Node();

  };

  class BPTree

  {

  Node *root;

  void insertInternal(int,Node*,Node*);

  void removeInternal(int,Node*,Node*);

  Node* findParent(Node*,Node*);

  public:

  BPTree();

  void search(int);

  void insert(int);

  void remove(int);

  void display(Node*);

  Node* getRoot();

  void cleanUp(Node*);

  ~BPTree();

  };

  什么是索引

  由于以上實現的數據結構與數據庫中索引相關,關于索引,有以下知識:

  唯一索引:唯一索引不允許兩行具有相同的索引值

  主鍵索引:為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,并且不能為空

  聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個

  非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小于 249 個

  MyISAM

  回到 MyISAM,其索引結構如下圖所示,由于 MyISAM 的索引文件僅僅保存數據記錄的地址。在 MyISAM 中,主索引和輔助索引(Secondary key)在結構上沒有任何區別:

  MyISAM 中索引檢索的算法為首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,則取出其 data 域的值,然后以 data 域的值為地址,讀取相應數據記錄。

  InnoDB

  對于 InnoDB 來說,表數據文件本身就是按 B+Tree 組織的一個索引結構,這棵樹的葉節點 data 域保存了完整的數據記錄。

  由于 InnoDB 利用的數據庫主鍵作為索引 Key,所以 InnoDB 數據表文件本身就是主索引,且因為 InnoDB 數據文件需要按照主鍵聚集,所以使用 InnoDB 作為數據引擎的表需要有個主鍵,如果沒有顯式指定的話 MySQL 會嘗試自動選擇一個可以唯一標識數據的列作為主鍵,如果無法找到,則會生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。

看完上述內容,你們對MySQL 中 InnoDB 和 MyISAM 的區別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博兴县| 博白县| 洪雅县| 石泉县| 柘荣县| 嘉峪关市| 柞水县| 偏关县| 宁蒗| 都安| 宁陵县| 泰兴市| 米脂县| 济南市| 乡宁县| 平乐县| 竹溪县| 宜兰县| 道孚县| 龙游县| 彰化县| 哈巴河县| 洛宁县| 湟中县| 安多县| 福安市| 濮阳县| 长顺县| 龙井市| 临夏县| 温州市| 鹿邑县| 遂川县| 布拖县| 厦门市| 来安县| 成安县| 清原| 黄石市| 香河县| 洱源县|