天天看点

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务必建好索引,否则锁粒度较大,会影响并发。

总结: 

MySQL两种内核对比

转载于:https://www.cnblogs.com/vanoraxnc/p/10379321.html