站群文章

25 04, 2021

MyISAM 和 InnoDB 的区别

2021-04-12T19:15:31+08:00发表于:2021-04-25|站群文章|

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

返回顶部