MySQL默认采用的是MyISAM。并发
MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,因此最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。指针
InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即 MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时若是等待队列中既有读请求又有写请求,默认写请求的优先级高,即便读请求先到,因此 MyISAM不适合于有大量查询和修改并存的状况,那样查询进程会长时间阻塞。由于MyISAM是锁表,因此某项读操做比较耗时会使其余写进程饿死。对象
InnoDB支持外键,MyISAM不支持。排序
InnoDB的主键范围更大,最大是MyISAM的2倍。索引
InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每一个词(停用词除外)创建倒排序索引。MyISAM的全文索引其实没啥用,由于它不支持中文分词,必须由使用者分词后加入空 格再写到数据表里,并且少于4个汉字的词会和停用词同样被忽略掉。队列
MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持如下空间数据对象:Point,Line,Polygon,Surface等。进程
没有where的count(*)使用MyISAM要比InnoDB快得多。因 为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。因此在InnoDB上执行count(*)时通常 要伴随where,且where中要包含主键之外的索引列。为何这里特别强调“主键之外”?由于InnoDB中primary index是和raw data存放在一块儿的,而secondary index则是单独存放,而后有个指针指向primary key。因此只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的做用较大。事务
InnoDB:
支持事务处理等
不加锁读取
支持外键
支持行锁
不支持FULLTEXT类型的索引
不保存表的具体行数,扫描表来计算有多少行
DELETE 表时,是一行一行的删除
InnoDB 把数据和索引存放在表空间里面
跨平台可直接拷贝使用
InnoDB中必须包含AUTO_INCREMENT类型字段的索引
表格很难被压缩it
MyISAM:
不支持事务,回滚将形成不彻底回滚,不具备原子性
不支持外键
不支持外键
支持全文搜索
保存表的具体行数,不带where时,直接返回保存的行数
DELETE 表时,先drop表,而后重建表
MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex)引申
跨平台很难直接拷贝
MyISAM中可使AUTO_INCREMENT类型字段创建联合索引
表格能够被压缩效率
选择:由于MyISAM相对简单因此在效率上要优于InnoDB.若是系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。若是系统读少,写多的时候,尤为是并发写入高的时候。InnoDB就是首选了。两种类型都有本身优缺点,选择那个彻底要看本身的实际类弄。