数据库引擎

其实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可移植性、备份及恢复
  1. MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
  2. InnoDB:拷贝数据文件、备份 binlog(二进制日志)或者用 mysqldump(数据量如果比较大的话会比较麻烦)
3.2外键
  1. MyISAM:不支持
  2. InnoDB:支持
3.3锁
  1. MyISAM:只支持表锁
  2. InnoDB:支持表锁、行锁。行锁大幅提高了多用户并发操作的性能。
    但是InnoDB的行锁,只是在WHERE的主键是有效的,
    非主键的WHERE都会锁全表
3.4CURD操作
  1. MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
  2. InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表 ,InnoDB不会重新建立表,而是一行一行的删除(这里我没看懂是什么意思…)
3.5行数count
  1. MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
  2. InnoDB:没有保存表的总行数(只能遍历),如果使用select count(*) from table ;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
3.6 查询效率

没有where的count()使用MyISAM要比InnoDB快得多。
因为MyISAM内置了一个计数器,count(
)时它直接从计数器中读,而InnoDB必须扫描全表。
所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。