MySQL存储引擎MyISAM和InnoDB
存储引擎
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
存储引擎的作用在表上,而不是数据库
innoDB(聚集)
innoDB是Mysql的存储引擎之一,也是默认的存储引擎;
索引结构
生成两种文件格式一种是.frm,另一种是.ibd
表名.frm:表结构文件
表名.ibd:索引和数据文件(InnoDB Data)
主键索引
innoDB索引和数据是存放在一起的,叶子节点保存了完整的数据记录
辅助索引
辅助索引叶子节点存放的是主键索引的值,从辅助索引查询找到主键索引的值,
再通过主索引的值再走一遍主键索引才找到数据,从辅助索引到主索引查询的过程叫做回表
注意事项
- 必须有主键
InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
innoDB会选择主键作为聚集索引,
如果没有主键那么会选择第一个不包含NULL值的唯一索引作为主键索引,
如果也没有那么一个主键索引,则innoDB会自动生成一个6字节大小的row_id作为聚集索引,这个索引是隐喻的 - 主键推荐使用自增
① 数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放
② 因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
③ 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
④ 如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销
同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
MyISAM(非聚集)
索引结构
表名.frm:表结构文件
表名.MYD:数据文件(MyISAM Data)
表名.MYI:索引文件(MyISAM Index)
MyISAM的数据文件和索引是分开存储,叶子节点存放的是数据的地址指针,
以Col2列建立索引,得到的辅助索引结构跟上面的主键索引的结构是相同的。
innoDB和MyISAM的区别
innoDB | MyISAM |
---|---|
聚集索引 | 非聚集索引 |
支持事物 | 不支持事物 |
支持外键 | 不支持外键 |
支持表锁 | 不支持表锁 |
支持行锁 | 不支持行锁 |
不支持全文索引 | 支持全文索引 |
适合insert,delefe,update | 大量select |
怎么选择
- 是否需要支持事物,需要是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
- 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB
- 系统奔溃后,MyISAM恢复起来更困难,能否接受;
- MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。