Mysql的存储引擎
InnoDB
InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别,其默认级别是REPEATBALE READ(可重复读), 并通过间隙锁(next-key locking)策略防止幻读的出现。
间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引的间隙进行锁定,防止幻影行的插入。
InnoDB标的基于聚簇索引建立的,其索引结构和Mysql的其他存储引擎有很大的不同,聚簇索引对主键查询有很高的性能,不过它的二级索引必须包含主键列,因此主键应该尽可能的小。
InnoDB内部做了许多优化,包括从磁盘读取数据时采用的可预测性预读,能够自动在内存中创建hash索引以加速读操作的自适应哈希索引以及能够加速插入操作的插入缓冲区
InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成。
优势:
-
支持事务安装:InnoDB 最重要的一点就是支持事务,可以说这是 InnoDB 成为 MySQL 中最流行的存储引擎的一个非常重要的原因。InnoDB 还实现了 SQL92 标准所定义的 4 个隔离级别(READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ 和 SERIALIZABLE)。
-
灾难恢复性好:InnoDB 通过 commit、rollback、crash-recovery 来保障数据的安全。具体来说,crash-recovery 就是指如果服务器因为硬件或软件的问题而崩溃,不管当时数据是怎样的状态,在重启 MySQL 后,InnoDB 都会自动恢复到发生崩溃之前的状态,并回到用户离开的地方。使用行级锁:
-
InnoDB 改变了 MyISAM 的锁机制,实现了行锁。虽然 InnoDB 的行锁机制是通过索引来完成的,但毕竟在数据库中 99%的 SQL 语句都要使用索引来检索数据。行锁定机制也为 InnoDB 在承受高并发压力的环境下增强了不小的竞争力。
-
在 SQL 查询中可以自由地将 InnoDB 类型的表与其他类型的表混合起来,甚至在同一个查询中也可以混合。
-
-
实现了缓冲处理:InnoDB 提供了专门的缓存池,实现了缓冲管理,不仅能缓冲索引也能缓冲数据,常用的数据可以直接从内存中处理,比从磁盘获取数据处理速度要快。相比之下,MyISAM 只是缓存了索引。
- InnoDB 的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被保存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。
-
支持外键:InnoDB 支持外键约束,检查外键、插入、更新和删除,以确保数据的完整性。在存储表中数据时每张表的存储都按主键顺序存放,如果没有显式地在定义表时指定主键,InnoDB 会为每一行生成一个 6 字节的 ROWID ,并以此作为主键。
- InnoDB 实现外键引用这一重要特性,使在数据库端控制部分数据的完整性成为可能。虽然很多数据库系统调优专家都建议不要这样做,但是对于不少用户来说,大部分情况下,在数据库端加外键控制仍然是成本最低的选择。
四大特性
-
插入缓冲(insert buffer)
-
二次写(double write)
-
自适应哈希索引(ahi):Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升
经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。 哈希(hash)是一种非常快的等值查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般3-4层,故需要3-4次的查询。
-
预读(read ahead):预读机制就是发起一个i/o请求,异步地在缓冲池中预先回迁若干页面,预计将会用到回迁的页面,这些请求在一个范围内引入所有页面。InnoDB以64个page为一个extent
MyISAM
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,而且有一个毫无疑问的缺陷是崩溃后无法安全恢复。
对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以继续使用MyISAM
MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。
特性:
-
加锁与并发
- MyISAM对整张表加锁,而不是针对行。读取时会对所有用到的表加共享锁,写入则加排他锁。但是有读取的时候,可以往表中插入新的记录(并发插入)
区别
MyISAM | InnoDB | |
---|---|---|
事务 | 不支持 | 支持事务 |
外键 | 不支持 | 支持 |
索引结构 | B+树,索引是数据文件的指针 | B+树,聚簇索引 |
count(*) | 变量存储 | 全表扫描 |
全文索引 | 支持 | 5.7版本后支持 |
锁 | 表锁(读锁+写锁 并发插入) | 表、行级锁 |
主键 | 可以没有 | 必须有 |
存储 | 索引数据分开(frm myd myi) | 表空间(frm, ibd) |
压缩 | 支持压缩 | 不支持 |
网友评论