美文网首页
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的联合索引,那边在索引中可以直接查出结果,无需回表到聚集索引中再去查。

    相关文章

      网友评论

          本文标题:MyISAM和InnoDB的区别

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