美文网首页
MySQL索引底层

MySQL索引底层

作者: 苏康申 | 来源:发表于2020-02-29 14:12 被阅读0次

    1.分析B树

    相关概念

    度数:在树中,每个节点的子节点(子树)的个数就称为该节点的度(degree)。
    阶数:(Order)阶定义为一个节点的子节点数目的最大值。(自带最大值属性)
    

    B-Tree

    image.png

    B+Tree

    image.png

    B+Tree与B-Tree区别

    叶子节点之间都有一个链指针,不需要遍历整棵树就可以得到所存储的全部数据,在进行范围查找的时候非常方便。
    B+Tree非叶子节点只存储索引index不存储data,所以同样大小的磁盘页可以容纳更多的节点元素
    
    

    Mysql底层结构

    image.png

    InnoDB

    主键索引


    辅助索引/联合索引
    image.png

    MyISAM

    主键索引

    image.png
    辅助索引/联合索引
    image.png

    InnoDB与MyISAM区别

    1.存储格式
    InnoDB:.frm存储表结构文件,字段长度等 .ibd文件存储数据信息和索引信息
    MyISAM: .frm 描述表结构文件,字段长度等  .MYD(MYData)数据信息文件,存储数据信息 
    .MYI(MYIndex)索引信息文件
    
    2.数据结构
    InnoDB与MyISAM底层都是采用B+Tree进行存储,但是对于InnoDB来说B+Tree叶子节点存储的是表的整条
    数据,对于MyISAM来说叶子节点存储的是数据的地址
    
    3.事务
    InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要
    原因之一;
    
    4.锁
    InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和
    更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因
    之一
    
    5.表的具体行数
    MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
    InnoDB:没有保存表的总行数,如果使用select count() from table;就会遍历整个表,消耗相当大,
    但是在加了wehre条件后,myisam和innodb处理的方式都一样。
    
    6. AUTO_INCREMENT
    MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动
    加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
    InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的
    行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
    
    
    7. 全文索引
    MyISAM:支持 FULLTEXT类型的全文索引
    InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
    
    8.表主键
    MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
    InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的
    一部分,附加索引保存的是主索引的值的数据列。
    
    
    9.CURD操作
    MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
    InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE从性
    能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果
    要清空保存有大量数据的表,最好使用truncate table这个命令。
    
    10. 外键
    MyISAM:不支持
    InnoDB:支持
    通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如
    事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。
    另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优
    势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
    
    

    漫画之B树与B+树的区别

    数据结构可视化工具

    InnoDB与MyISAM区别

    相关文章

      网友评论

          本文标题:MySQL索引底层

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