共計 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 小編將為大家輸出更多高質量的實用文章!