首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL两种存储引擎InnoDB和Myisam全面剖析

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更多。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200515A09Y3U00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券