MyISAM与InnoDB

引用

MyISAM与InnoDB对比

InnodbMyISAM
事务YN
外键YN
索引* 聚集索引,B+树作为索引结构
* 主键索引的叶子节点即数据文件
* 必须要有PK,PK索引效率很高
* 但是辅助索引需要两次查询,先查询到主键,再查询到数据,因此,主键不应过大,否则其他索引也很大
* 非聚集索引,B+树作为索引结构
* 索引与数据分离,索引保存的是数据文件的指针
数据表行查询需要select count(\*) from table时需要全表扫描变量保存,查询很快
全文检索5.7后支持支持,查询效率高
表锁、行锁(默认)
注:行锁是实现在索引上,而不是锁在物理有上,即是说访问没有命中索引,也无法使用行锁,退化为表锁
表锁
存储文件* frm:表定义文件
* ibd:数据文件
* frm:表定义文件
* myd:数据文件
* myi:索引文件
SELECT性能
  • MyISAM比Innodb查询快的原因?

    • INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:
      • 数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间还有换进换出的减少;
      • innodb寻址要映射到块,再到行,MYISAM记录的直接是文件的OFFSET,定位比INNODB要快
      • INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护MVCC (Multi-Version Concurrency Control)多版本并发控制
  • 如何选择?

    • 要支持事务,使用innodb
    • 绝大多数都只是查询,考虑使用MyIsam
    • crash后,MyISAM恢复困难
    • 5.5默认为Innodb
  • InnoDB为什么推荐使用自增ID作为主键?

    答:自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

聚集索引与非聚集索引

  • 聚簇索引是唯一的,一个 InnoDB 表只有一个聚簇索引,而且一定会有一个聚簇索引,如果不存在,Innodb 存储引擎会自动添加一个( GEN_CLUST_INDEX 的隐式的聚簇索引 )
  • 非聚簇所以可以有多个,而且只能由用户自己添加,InnoDB 默认并不会创建任何非聚簇索引。

附录

  • 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';    无索引,表锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值