数据库的存储引擎
- 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等,使用不同的存储引擎,还可以获得特定的功能。
- InnoDB和MyISAM是MySQL的两个存储引擎
- MySQL默认的存储引擎是InnoDB,但是MySQL对于多存储引擎有着很好的兼容,一个数据库服务器上不同的数据库完全可以使用不同的数据引擎,甚至一个数据库中的多个表也可以使用不同的引擎。
InnoDB和MyISAM引擎的区别与联系
- InnoDB 支持事务,MyISAM不支持,对于InnoDB 每一条 SQL 语句都会默认封装成事务进行提交,这样就会影响执行速度,优化的方法就是将多条语句放在 begin和commit之间,组成一个事务。
- InnoDB 支持外键,但是MyISAM 不支持
- InnoDB 不支持全文索引,但是MyISAM 支持全文索引,查询效率上MyISAM 的会更加快一点。
如果一个表修改要求比较高的事务处理,可以选择InnoDB。对于查询要求比较高的表可以选择MyISAM存储。 那么这两个存储引擎为什么会出现较大的差别呢?那么就要研究其底层实现原理。
存储引擎底层原理
1.索引
- 唯一索引: 唯一索引不允许两行具有相同的索引值
- 主键索引: 为表定义一个主键索引将会自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值都是唯一的,并且不能为空。
- 聚集索引:表中各行的物理顺序与键值的索引顺序相同,每个表中只能有一个
- 非聚集索引:非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含执行数据存储位置的指针可以有多个,小于249个。
2. InnoDB 和 MyISAM 两种引擎使用的索引的数据结构都是B+树
区别为:
- InnoDB 中的B+ 树的结构中存储的都是实际的数据,这种索引被称为聚集索引。
- MyISAM 中的 B+ 树的数据结构存储的内容是实际数据的地址值,他的索引和实际数据是分开的,只不过使用了索引指向了实际数据,这种索引的模式被称为非聚集索引。
3. 什么是B树和B+树
B树:B树属于多叉树有名平衡多路查找树,其规则是:
- 所有节点关键字是按递增次序排列,并遵循左小右大的原则
- 子节点树:非叶子结点的子节点数>1,且<=M,且M>=2,空树除外(M阶代表一个树节点最多有多少个- 查找路径,M =M路,当M=2则是二叉树,M=3时就是三叉树)
关键字数:枝节点的关键字数量大于等于ceil(m/2)-1 个且小于等于 M-1 个(ceil() 是一个朝正无穷方向取整的函数) - 叶子节点的指针为空且叶子节点具有相同的深度。
B+树:B+树是B树的一个升级版,相对于B树来说B+树更加充分的利用了节点的空间,使得查询速度更加稳定,其速度接近于二分查找。
- 拥有 K 个孩子的非叶子节点包含 k 个keys(关键字),且递增排列。每个关键字不保存数据,只用来索引。
- 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的非叶子结点可以看成是索引部分,结点中仅含有其子树(根结点)中最大(或最小)关键字
- 非叶子结点的子树指针P[i],指向关键字值属于[ K[i], K[i+1] )的子树
MyISAM
MyISAM的索引文件仅仅只是保存数据记录的地址。MyISAM 中索引检索的算法首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data的值,然后根据data域的值为地址读取相应的数据记录。
InnoDB
对于InnoDB,表数据文件本身就是按照B+Tree组织一个索引结构,这棵树的叶子节点data域保存了完整的数据记录。
由于 InnoDB 利用的数据库主键作为索引 Key,所以 InnoDB 数据表文件本身就是主索引,且因为 InnoDB 数据文件需要按照主键聚集,所以使用 InnoDB 作为数据引擎的表需要有个主键,如果没有显式指定的话 MySQL 会尝试自动选择一个可以唯一标识数据的列作为主键,如果无法找到,则会生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。