数据库引擎
其实MySQL支持多种存储引擎,每种引擎有着一些自己独特的功能,用户在使用的时候,可以根据自己的业务场景来使用不同的存储引擎,其中MySQL最常用的存储引擎为:MyISAM和InnoDB。
MySQL的默认引擎5.7以前是MyISAM,5.7以后是InnoDB。建议使用InnoDB。
关于MyISAM和InnoDB一些性能比较的表格的博客
以下是自己的理解,后面可修正
1.InnoDB
InnoDB是支持事务操作,行级锁,所以在大量的update、insert、delete操作的时候性能比较好。但是InnoDB的数据只存储在一个文件里,并且InnoDB表所需要的内存和存储也会比较多。所以InnoDB表的大小受限于系统的限制,一般为2G。
2.MyISAM
MyISAM不支持事务操作,并且只支持表级锁(select,update,delete,insert语句都会给表自动加锁)。但是MyIAM数据存储分为三个文件(1.frm - 表格定义 2.MYD(MYData) - 数据文件3.MYI(MYIndex) - 索引文件)。所以如果执行大量的SELECT,MyISAM是更好的选择。
3.区别
3.1可移植性、备份及恢复
- MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
- InnoDB:拷贝数据文件、备份 binlog(二进制日志)或者用 mysqldump(数据量如果比较大的话会比较麻烦)
3.2外键
- MyISAM:不支持
- InnoDB:支持
3.3锁
- MyISAM:只支持表锁
- InnoDB:支持表锁、行锁。行锁大幅提高了多用户并发操作的性能。
但是InnoDB的行锁,只是在WHERE的主键是有效的,
非主键的WHERE都会锁全表
3.4CURD操作
- MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
- InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表 ,InnoDB不会重新建立表,而是一行一行的删除(这里我没看懂是什么意思…)
3.5行数count
- MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
- InnoDB:没有保存表的总行数(只能遍历),如果使用select count(*) from table ;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
3.6 查询效率
没有where的count()使用MyISAM要比InnoDB快得多。
因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。
所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。