美文网首页
MyISAM和InnoDB的区别

MyISAM和InnoDB的区别

作者: 谦业 | 来源:发表于2023-10-11 08:46 被阅读0次

MyISAM和InnoDB的区别

功能成本上看:

MyISAM读快,写慢,支持表锁不支持行锁,不支持事务和外键,支持全文索引

innodb相对而言写快,读慢,支持行锁、事务、外键,不支持全文索引

数据存储方式上来看:

MyISAM和InnoDB都使用B+树来实现索引:

(1)MyISAM的索引与数据分开存储;
(2)MyISAM的索引叶子节点存储指针,主键索引与普通索引无太大区别;都是非聚集索引
(3)InnoDB的聚集索引和行数据统一存储;
(4)InnoDB的聚集索引存储数据行本身,普通索引存储主键;
(5)InnoDB不宜使用较长的列作为PK;
(6)InnoDB普通索引可能存在回表查询,常见的解决方案是覆盖索引;

聚集索引和非聚集索引

MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)

其主键索引与普通索引没有本质差异:

(1)有连续聚集的区域单独存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录的指针;
(3)普通索引的叶子节点,存储索引列,与对应行记录的指针;

InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引(Clustered Index)

(1)没有单独区域存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录(而不是指针);

因为这个特性,InnoDB的表必须要有聚集索引

(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个非空unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

B+树

MyISAM和InnoDB都使用B+树来实现索引

B+树的特点是:

  1. 根节点和子节点都只保存关键字(索引字段),这样就可以降低树的高度,减少IO次数
  2. 只有叶子节点保存数据(主键索引的叶子节点保存行数据,其他索引叶子节点保存的是主键)
  3. 叶子节点上的数据是顺序存储的,节点之间还有引用关系(为排序和全表扫描提供更好的查询性能)

注意点: 建议使用自增id作为主键
原因参考第3点,如果使用趋势递增主键,插入记录时,不会索引分裂,不会大量行记录移动。

索引覆盖

在一张索引表上就可以查出想要的结果就是索引覆盖

比如在innodb引擎中,执行sqlselect id,name,age from user,这张表刚好建立了name+age的联合索引,那边在索引中可以直接查出结果,无需回表到聚集索引中再去查。

相关文章

  • mysql

    常见的储存引擎 InnoDB MyISAM MyISAM和InnoDB的区别 ①InnoDB支持事务,MyISAM...

  • 数据库引擎

    MyISAM和InnoDB区别

  • 常见面试题

    MyISAM和InnoDB的区别 MyISAM不支持事务,而InnoDB支持事务的。 MyISAM锁的粒度是表级,...

  • 文章总结(6)—数据库

    InnoDB和MyISAM存储引擎的区别 InnoDB使用的是行锁,MyISAM使用的是表锁; InnoDB支持事...

  • MySQL 篇 --- 2021-08-31

    MyISAM 和 InnoDB 的区别 MyISAM 查询效率更高,但是不支持事物 InnoDB 插入、更新较高,...

  • Innodb和MyIsam的区别

    Innodb和MyIsam的区别 (1)对事务的⽀持不同MyIsam不⽀持事务,⽽InnoDB⽀持事务。(2)锁的...

  • 数据库常见问题

    MyISAM和InnoDB 主要区别: 1).[事务]MyISAM是非事务安全型的,而InnoDB是事务安全型的,...

  • MySQL学习日记(十一)-技术问答

    一、MySQL主要存储引擎MyISAM和InnoDB的区别? 1、 存储结构 MyISAM:每个MyISAM在磁盘...

  • mysql的引擎、innodb/Myisam 的区别

    四种引擎:Memory、MYISAM、DBD、InnoDB、Archive MyISAM与InnoDB的区别MyI...

  • mysql(七)

    MySQL存储引擎-innodb 查看存储引擎 innodb和myisam的物理区别 innodb 核心特性 MV...

网友评论

      本文标题:MyISAM和InnoDB的区别

      本文链接:https://www.haomeiwen.com/subject/unpgbdtx.html