MySQL两种内核对比
MySQL内核
https://blog.csdn.net/baichoufei90/article/details/83504446
关键字:全文索引 索引外置
两种内核:MyISAM 和InnoDB
区别
1.count(*)
MyISAM会存储总行数,InnoDB不会存储总行数,select count(*)时是一行一行进行扫描的,而MyISAM操作select count(*)时结果很快
实践:数据量大的表,InnoDB就尽量不要使用select count(*)查询,性能消耗大
备注:只有查询全表时MyISAM才会直接返回结果,加where条件之后的话MyISAM和InnoDB原理相同
2.全文索引(https://www.cnblogs.com/tommy-huang/p/4483684.html)
MyISAM支持全文索引,InnoDB5.6之前不支持全文索引
备注:数据量大并发量大时,不建议使用数据库自带的全文索引,应该使用索引外置的架构设计方法,MyISAM也不是最优选。
3.事务
MyISAM不支持事务,InnoDB支持事务
备注:事务具有commit,rollback这些崩溃修复能力;MyISAM在系统异常崩溃时可能造成文件损坏。但是事务很耗性能,影响吞吐量,所以尽量只对一致性要求较高的业务使用事务。
4.外键
MyISAM不支持外键,InnoDB支持外键
备注:数据量大并发量大时,都不建议使用外键,要通过应用程序保证数据的完整。
5行锁和表锁
MyISAM只支持表锁,InnoDB还支持行锁
备注:
MyISAM执行语句时,会对整个表加锁,数据量大并发量大时,性能影响较大
InnoDB细粒度行锁,在数据量大时,性能影响较小
实践:select+insert时使用Myisam,因为Myisam在文件尾部顺序增加记录速度快;但是大部分是读写混合,数据量大时就使用InnoDB
坑:InnoDB的行锁是实现在索引上的,而不是锁在屋里行记录上,如果没有命中索引,就不能使用行锁,将使用表锁
1.5.2 示例
例如有用户信息表如下,且无其他索引:
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='shenjian'; #无索引,表锁。
启示:InnoDB务必建好索引,否则锁粒度较大,会影响并发。
总结: