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 时的作用较大。