网站首页 > 基础教程 正文
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更多。
Memory引擎是hash索引,hash索引速度极快,但是不支持范围查询,也无法排序,也不能利用索引存储字段来避免读行。Memory引擎大多用来做缓存或基本表映射使用,顾名思义掉电数据即全部丧失
猜你喜欢
- 2024-10-12 数据库笔试面试25——有关InnoDB和MyISAM的说法中
- 2024-10-12 Mysql中的InnoDB和MyISAM|每天一面试题
- 2024-10-12 数据库常见面试题:InnoDB和MySIAM的区别-开课吧
- 2024-10-12 记一次生产数据库MyISAM存储引擎转为Innodb过程
- 2024-10-12 InnoDB 和 MyISAM的数据分布是什么样的?
- 2024-10-12 程序员冷知识,Mysql的数据库引擎为什么多选InnoDB?
- 2024-10-12 MySQL之MyISAM索引和InnoDB索引的实现细节
- 2024-10-12 MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么?
- 2024-10-12 MyISAM 与 InnoDB 索引的区别有哪些?
- 2024-10-12 mysql-innodb和myisam存储引擎 mysql的两种存储引擎区别,各自的使用场景
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)