InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。
一.myisam引擎
1.mysql默认引擎,不支持事务*
2.表级锁定,更新时,锁定机制是整张表被锁定,其它连接无法更新表的数据,效率比较低下.锁的机制成本很少,但大大降低了并发性能*
3.读写互相阻塞,写的时候阻塞读,读的时候也阻塞写,但读与读之间不阻塞*
4.只对索引进行缓存,虽然key_buffer可以大幅提高性能,减少磁盘IO,但对数据不缓存
5.适合读业务比较多的生产环境,比如BLOG等,读的速度比较快.
6.占用资源比较少.服务器硬件不好时.可以考虑使用
7.数据恢复没有innodb引擎恢复的完美
8.支持全文索引,不支持外键约束
二.mysiam引擎应用场景:
1.不需要事务支持的场景,读数据多的网站.
2.并发相对较低的业务,因为表级锁定的机制限制
3.数据修改相对较少的业务.阻塞问题
4.对数据要求一致性不高的业务.
三.myisam引擎优化:
1.尽量索引,缓存机制
2.调整读写优先级
3.启用延迟插入.
4.生产环境应用memcache缓存的多.Mysql本身的缓存为用少
四.innodb引擎
1.支持事务,四个级别的事务
2.锁定机制一般是行级锁定.更新时只锁定当前行,其它的行.没关系,可以继续读写.全表扫描.还是表锁*
3.读写阻塞与事务的隔离相关,读取速度一般*
4.可以缓存数据和索引,高效的缓存特性
5.支持分区,表空间.
5.适合读写业务比较多的环境,比如BBS等.一般的生产环境,也推荐用innodb.效率高
6.服务器资源开销大
8.支持外键约束,不支持全文索引.
五.innodb应用场景
1.需要事务支持的业务
2.适合高并发的业务,行级锁定.对高并发有很好的适应能力.但要确定查询是通过索引完成.
3.数据更新比较频繁的场景.如BBS
4.数据一致性要求较高
5.硬件设备内存较大时,可以利用innodb较好的缓存能力来提高内存利用率.尽可能的减少磁盘IO
区别总结:
1.InnoDB不支持FULLTEXT类型的索引.
2.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可.注意的是,当count()语句包含 where条件时,两种表的操作是一样的.
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引.
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除.
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
另外,InnoDB表的行锁也不是绝对的,如果在执行一个sql语句时MysqL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”