MySQL主要分为服务层和存储层。其中服务层包括查询语句解析,优化,查询结果缓存等功能,而存储引擎则负责建立索引,保存数据,查找数据等。可以毫不客气的说,MySQL的存储引擎对于MySQL来说有着至关重要的作用,无论从系统最终的性能还是吞吐能力来说。接下来,我将来详细的讨论一下它们之间的种种差异。
InnoDB存储引擎,是一种常见的引擎。其存储为一个文件夹,无操作系统的最大文件存储限制,底层存储使用了表空间idb文件,idb文件中又有segment文件,segment文件对应于一个一个叶子页,segment文件中又有page文件,page文件里面才是行数据。
其次,InnoDB支持事务,外键约束和行级别锁,支持mvcc(多版本并发控制,一种基于创造版本和删除版本的乐观锁实现方法)。InnoDB的索引是建立在B+树结构上的聚集索引,聚集索引的特点就是数据和索引都在叶子节点上,且索引逻辑上顺序,数据物理存储上也是顺序,故对于连续读取,顺序读取等IO密集型的程序非常友好,但插入操作会非常慢,意味每次插入都意味着对其它存储空间的调整。
再者,它支持行级锁,这是在面对多线程问题时,非常高效的特性。但是,它并不是时刻有效的。当查询用到索引时,在B+树中查询只扫描到部分数据,InnoDB会将它们加锁。但是如果查询没有用到索引时,那么查询就会变成全表扫描,所有的数据都会被InnoDB加锁,InnoDB的行锁机制就会变成表级锁。
myisam存储引擎,提供表级锁,不支持事务,外键。有操作系统最大文件大小限制,适用于不大,读操作频繁的业务。用myd文件存储所有的数据,myi文件存储索引,myi文件中保存数据在myd文件中的位置就行。可以用虚拟表merge将多个myisam表虚拟成一个表,虚拟表提供一个大量数据下高效的读取方案。
myisam支持压缩表,提高查询性能。默认是对字符串进行压缩,也可以对数值进行压缩。对于字符串可以采用前缀压缩的方式,提高索引时的性能,例如原索引为“http://xxx/123.png”前缀压缩后为"564,123png"。
其次myisam采取非聚集索引,其索引时叶子节点不包含数据,只包含指向磁盘数据块的指针。对于连续访问,无法读取连续的磁盘数据块,所以连续读取时IO操作比InnoDB更多。
领取专属 10元无门槛券
私享最新 技术干货