• MySQL中InnoDB和MyISAM引擎的对比


    目录

    • 索引对比
    • 锁对比
    • 事务对比
    • 并发
    • 全文索引对比
    • 外键
    • 其他

    一.索引对比

    1.B+树概念

    我们这里关注B+树的两个特性:

    1. 叶子节点包含数据data(data并不特指数据库中的某一行数据,也可以是某个数值,指针等)
    2. 叶子节点均在同一层,且每个节点均可以直接找到上一个或者下一个节点(双向指针,比常规的B+树多了一个指向上一个的指针)

    2.Innodb

    以用户表为例,id为主键,另外name存在索引idx_name

    CREATE TABLE `t_user` (
      `id` bigint,
      `name` varchar(10),
      `age` int,
      PRIMARY KEY (`id`),
      KEY `idx_name` (`name`)
    );
    

    插入数据:

    insert into t_user (id,`name`,age) values
    (1,'n7',10),
    (2,'n6',20),
    (3,'n5',30),
    (4,'n4',40),
    (5,'n3',50),
    (6,'n2',60),
    (7,'n1',70)
    

    ①聚簇索引(聚集索引)

    聚簇索引:行数据与键值(主键)紧凑地存储在一起;

    InnoDB中表现为:B+树叶子节点的data用于存放行数据(包含主键值、其他列数据、回滚指针、事务id等),物理上索引数据与行数据都放在同一个文件中(.ibd

    如果没有定义主键,InnoDB会选择一个非空的唯一索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键(DB_ROW_ID)来作为聚簇索引。
    

    ②辅助索引

    与聚簇索引最大的不同是:B+树的data存放的并不是行数据,而是主键值

    select * from t_user where name='n1'时,会先通过idx_name索引找到n1对应的主键的值(id=7),再通过主键值找到行数据 [7,n1,70] 。

    3.MyISAM 索引

    与InnoDB不同,MyISAM并不使用聚簇索引,MyISAM的索引数据和行数据是分开的,物理上分别为.myi索引数据文件和.myd行数据文件(InnoDB 索引和行数据均在.idb文件中)

    MyISAM中,主键索引和其他的一般索引在数据结构上并没有什么区别,B+树的data存放的均是数据行地址

    主键索引:

    普通索引:

    二.锁对比

    mysql支持三种锁定级别,行级、页级、表级;

    MyISAM支持表级锁定,提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)

    InnoDB支持行级锁,但值得注意的是InnoDB的行锁是加到索引上的,所以在某次查找时没有用上索引,InnoDB表同样会锁全表。

    三.事务对比

    InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,以事务为单位操作可以提高多用户并发操作的性能。

    MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择

    四.并发

    MyISAM读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

    InnoDB 读写阻塞与事务隔离级别相关。

    五.全文索引

    MyISAM支持FULLTEXT类型的全文索引

    InnoDB不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好

    六.外键

    MyISAM不支持

    InnoDB支持

    七.其他

    InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。

    MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

    站在巨人的肩膀上摘苹果:

    https://www.jianshu.com/p/8e054da3da05

    https://www.cnblogs.com/leonandyou/p/11337273.html

    https://www.cnblogs.com/balfish/p/8288891.html

  • 相关阅读:
    bug-- java.lang.RuntimeException: Type “Klass*"
    ThreadPoolExecutor源码分析二
    ThreadPoolExecutor源码分析一
    java动态代理框架
    liunx 中一个命令可以检测 ps -C java --no-heading| wc -l 一般用于shell脚步编写用
    log4j.properties 使用说明
    图文详解MyEclipse中新建Maven webapp项目的步骤(很详细)
    MySQL高可用性之Keepalived+Mysql(双主热备)
    使用cglib动态创建类,添加方法
    2017年5月5日 星红桉liunx动手实践mysql 主主双机热备
  • 原文地址:https://www.cnblogs.com/eternityz/p/12512316.html
Copyright © 2020-2023  润新知