mysql中myisam与innodb的区别
类型 | myisam | innodb |
---|---|---|
事务支持 | 不支持:查询更快,每次查询具有原子性 | 支持事务,回滚 |
锁粒度 | 表级锁 | 行级锁 |
外键 | MyISAM不支持 | InnoDB支持外键 |
表主键 | 允许没有任何索引和主键的表存在,索引都是保存行的地址 | 如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见) |
全文索引 | MyISAM支持 | InnoDB不支持全文索引 |
可移植性、备份及恢复 | 数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作 | 免费的方案可以是拷贝数据文件、备份 binlog或者用mysqldump,在数据量达到几十G的时候就相对痛苦了 |
MySQL 表锁和行锁机制
- InnoDB 支持表锁和行锁,使用索引作为检索条件修改数据时采用行锁,否则采用表锁。
- InnoDB 自动给
修改
操作加锁,给查询操作不自动加锁 - 行锁可能因为未使用索引而升级为表锁,所以除了检查索引是否创建的同时,也需要通过 explain 执行计划查询索引是否被实际使用。
- 行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟锁的粒度小。
- 当表的大部分数据需要被修改,或者是多表复杂关联查询时,建议使用表锁优于行锁。
- 为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接影响到一个数据库的并发处理能力和性能。
- InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁
← 1.mysql执行过程 sql模式→