久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql中MyISAM和InnoDB有哪些不同點

159次閱讀
沒有評論

共計 2542 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內容介紹了“mysql 中 MyISAM 和 InnoDB 有哪些不同點”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

區別:1、InnoDB 支持事務,MyISAM 不支持;2、InnoDB 支持外鍵,而 MyISAM 不支持;3、InnoDB 是聚集索引,而 MyISAM 是非聚集索引;4、Innodb 不支持全文索引,而 MyISAM 支持全文索引;5、InnoDB 支持表、行級鎖,而 MyISAM 支持表級鎖;6、InnoDB 表必須有唯一索引,而 Myisam 可以沒有;7、存儲文件不同。

InnoDB:MySQL 默認的事務型引擎,也是最重要和使用最廣泛的存儲引擎。它被設計成為大量的短期事務,短期事務大部分情況下是正常提交的,很少被回滾。InnoDB 的性能與自動崩潰恢復的特性,使得它在非事務存儲需求中也很流行。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮 InnoDB 引擎。

MyISAM:在 MySQL 5.1 及之前的版本,MyISAM 是默認引擎。MyISAM 提供的大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但 MyISAM 并不支持事務以及行級鎖,而且一個毫無疑問的缺陷是崩潰后無法安全恢復。

mysql 中 MyISAM 和 InnoDB 的區別:

1. InnoDB 支持事務,MyISAM 不支持,對于 InnoDB 每一條 SQL 語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條 SQL 語言放在 begin 和 commit 之間,組成一個事務; 

2. InnoDB 支持外鍵,而 MyISAM 不支持。對一個包含外鍵的 InnoDB 表轉為 MYISAM 會失?。?nbsp;

3. InnoDB 是聚集索引,使用 B +Tree 作為索引結構,數據文件是和(主鍵)索引綁在一起的(表數據文件本身就是按 B +Tree 組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數據。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。

      MyISAM 是非聚集索引,也是使用 B +Tree 作為索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。

也就是說:InnoDB 的 B + 樹主鍵索引的葉子節點就是數據文件,輔助索引的葉子節點是主鍵的值;而 MyISAM 的 B + 樹主鍵索引和輔助索引的葉子節點都是數據文件的地址指針。

4. InnoDB 不保存表的具體行數,執行 select count(*) from table 時需要全表掃描。而 MyISAM 用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快(注意不能加有任何 WHERE 條件);

那么為什么 InnoDB 沒有了這個變量呢?

因為 InnoDB 的事務特性,在同一時刻表中的行數對于不同的事務而言是不一樣的,因此 count 統計會計算對于當前事務而言可以統計到的行數,而不是將總行數儲存起來方便快速查詢。InnoDB 會嘗試遍歷一個盡可能小的索引除非優化器提示使用別的索引。如果二級索引不存在,InnoDB 還會嘗試去遍歷其他聚簇索引。
    如果索引并沒有完全處于 InnoDB 維護的緩沖區(Buffer Pool)中,count 操作會比較費時。可以建立一個記錄總行數的表并讓你的程序在 INSERT/DELETE 時更新對應的數據。和上面提到的問題一樣,如果此時存在多個事務的話這種方案也不太好用。如果得到大致的行數值已經足夠滿足需求可以嘗試 SHOW TABLE STATUS

5. Innodb 不支持全文索引,而 MyISAM 支持全文索引,在涉及全文索引領域的查詢效率上 MyISAM 速度更快高;PS:5.7 以后的 InnoDB 支持全文索引了

6. MyISAM 表格可以被壓縮后進行查詢操作

7. InnoDB 支持表、行 (默認) 級鎖,而 MyISAM 支持表級鎖

InnoDB 的行鎖是實現在索引上的,而不是鎖在物理行記錄上。潛臺詞是,如果訪問沒有命中索引,也無法使用行鎖,將要退化為表鎖。

例如:

t_user(uid, uname, age, sex) innodb;
 
 uid PK
  無其他索引
 update t_user set age=10 where uid=1;  命中索引,行鎖。 
 update t_user set age=10 where uid != 1;  未命中索引,表鎖。 
 update t_user set age=10 where name= chackca   無索引,表鎖。

8、InnoDB 表必須有唯一索引(如主鍵)(用戶沒有指定的話會自己找 / 生產一個隱藏列 Row_id 來充當默認主鍵),而 Myisam 可以沒有

9、Innodb 存儲文件有 frm、ibd,而 Myisam 是 frm、MYD、MYI

       Innodb:frm 是表定義文件,ibd 是數據文件

       Myisam:frm 是表定義文件,myd 是數據文件,myi 是索引文件

如何選擇:

   1. 是否要支持事務,如果要請選擇 innodb,如果不需要可以考慮 MyISAM;

   2. 如果表中絕大多數都只是讀查詢,可以考慮 MyISAM,如果既有讀也有寫,請使用 InnoDB。

   3. 系統奔潰后,MyISAM 恢復起來更困難,能否接受;

   4. MySQL5.5 版本開始 Innodb 已經成為 Mysql 的默認引擎(之前是 MyISAM),說明其優勢是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不會差。

InnoDB 為什么推薦使用自增 ID 作為主鍵?

    答:自增 ID 可以保證每次插入時 B + 索引是從右邊擴展的,可以避免 B + 樹和頻繁合并和分裂(對比使用 UUID)。如果使用字符串主鍵和隨機主鍵,會使得數據隨機插入,效率比較差。

innodb 引擎的 4 大特性

      插入緩沖(insert buffer), 二次寫(double write), 自適應哈希索引(ahi), 預讀(read ahead)

“mysql 中 MyISAM 和 InnoDB 有哪些不同點”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計2542字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 山阳县| 开远市| 淳安县| 皋兰县| 天柱县| 永川市| 温宿县| 岫岩| 杂多县| 万载县| 鲁甸县| 新沂市| 清远市| 和平区| 鲜城| 巢湖市| 博罗县| 鹿泉市| 四子王旗| 乌兰浩特市| 丹凤县| 疏勒县| 正安县| 上林县| 陇西县| 钟祥市| 保康县| 左贡县| 离岛区| 安顺市| 昌黎县| 安阳市| 营山县| 洞口县| 靖安县| 永丰县| 蕲春县| 光山县| 九寨沟县| 石楼县| 和顺县|