mysql中的几种存储引擎
mysql常用的几种存储引擎

MyISAM:
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,支持全文索引(SELECT * FROM article WHERE MATCH(title, content) AGAINST('查询字符串'))。只支持表级锁,不支持外键
文件结构:
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。
.frm文件存储表定义。
数据文件的扩展名为.MYD (MYData)。
索引文件的扩展名是.MYI (MYIndex)。
MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
1.select count(*) from table,MyISAM内部维护了一个计数器保存了表的具体行数,Innodb需要扫描整个表来计算行数。
2.select比较多,适合用MyISAM
InnoDB:
InnoDB默认支持的隔离级别是可重复读
Innodb 支持事务处理与外键和行级锁,MVCC
四大特性:
插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)
InnoDB逻辑存储结构:
所有的表都保存在同一个数据文件中
InnoDB的主键索引树的叶子节点保存主键和相应的数据(聚集索引)。其它的索引树的叶子节点保存的是主键(非聚集索引)。也正是因为采取了这种存储方式,InnoDB才强制要求每张表都要有主键。
所有表的数据被逻辑的存放在一个表空间里。表空间又由段(segment)区(extent)页(page)组成,页在一些文档中也称为块。
Page是Innodb存储的最基本结构,也是Innodb磁盘管理的最小单位,与数据库相关的所有内容都存储在Page结构里。数据页即为B+树的叶节点,索引页即为B+树的非索引节点(非叶子节点)。
区由64个连续的页组成,每个页的大小16kb,每个区的大小1Mb。对于大的数据段,InnoDB存储引擎最多可以申请4个区。

1.可靠性要求比较高,或者要求事务。
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2.支持行锁,表更新和删除比较多的时候,推荐InnoDB。
关于MyISAM和InnoDB的一些区别?
1.MyISAM仅缓存索引信息,而不缓存实际的数据信息。而InnoDB不仅缓存索引信息,还会缓存数据信息。其将数据文件按页读取到缓冲池(磁盘预读,减少IO),然后按最近最少使用的算法来更新数据。
2.MyISAM的select操作更快:
     1)innodb寻址要映射到块,再到行,MYISAM 记录的直接是文件的OFFSET,定位比INNODB要快。
     2)INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护。
3)MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
3.InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4.select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。对于InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5.如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
Archive:
高压缩和快速插入的特点Archive非常适合作为日志表的存储引擎,但是前提是不经常对该表进行查询操作。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。
它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/9573985.html
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号