Mysql:MyISAM、InnoDB区别
- Mysql数据库支持不同的存储引擎,用于实现不同的效果及性能扩展
- 使用最广泛的是MyISAM及InnoDB,针对mysql的开源软件,一般也就使用这2个,还有个Memory,顾名思义是存储在内存中的,保证速度,但重启会被清空,并且数据量根据内存的上线有关
MyISAM | InnoDB | |
事务 | 不支持 | 支持,支持外键等高级数据库功能 |
构成 | 每个表由3个文件构成
.frm 存储表定义结构 .MYD 存储表数据MYData .MYI 存储表索引 MYIndex |
默认情况下:
.frm 存储表定义结构 所有表数据都存储在ibdata 可以通过修改mysql设置 innodb_file_per_table = 1 将每个表数据单独存放 .Ibd 存储表数据 |
语句区别 | Select快速,增删改速度不行
因为要重新建立索引 |
能快速的进行增删
Select速度不及Myisam Delete删除整个表是一行行删除 |
计数操作 | 如果没有条件,count(*)直接获取已经保存好的行数,速度很快 | 不保存行数
需要扫描一遍整个表来计算行数 |
锁机制 | 表锁,这也是增删改速度不行的原因 | 行锁,大多数情况下都是如此
读取数据的时候不加锁 但在Mysql自身需要扫描全部表的时候还是会设置表锁 |
自增长字段 | 内部优化,对于该字段查询的添加修改是很快的
可以和其他字段建立联合索引 |
必须设置只有该字段的索引,不可能和其他字段建立联合索引 |
- 针对不同的需求对应选择不同的表引擎
- 最主要的区别就是对于读写的区别,在主从库分离的构架中,通常会在主库中使用InnoDB,在从库中使用MyISAM,做读写分离,实现性能及功能的保证
- 数据引擎和使用的SQL语句息息相关,基本使用没有问题,但在遇到性能问题的时候通常需要排查SQL,用于确定性能瓶颈