大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技( 四 )


第二 , B+树的叶子节点是数据阶段用了一个链表串联起来 , 便于范围查找 。
大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技
本文插图
通过 B 树和 B+树的对比我们看出 , B+树节点存储的是索引 , 在单个节点存储容量有限的情况下 , 单节点也能存储大量索引 , 使得整个 B+树高度降低 , 减少了磁盘 IO 。 其次 , B+树的叶子节点是真正数据存储的地方 , 叶子节点用了链表连接起来 , 这个链表本身就是有序的 , 在数据范围查找时 , 更具备效率 。 因此 Mysql 的索引用的就是 B+树 , B+树在查找效率、范围查找中都有着非常不错的性能 。
二、InnoDB引擎和MyISAM引擎的实现
MySQL底层数据引擎以插件形式设计 , 最常见的是 InnoDB 引擎和 MyISAM 引擎 , 用户可以根据个人需求选择不同的引擎作为 MySQL 数据表的底层引擎 。 我们刚分析了 , B+树作为 MySQL 的索引的数据结构非常合适 , 但是数据和索引到底怎么组织起来也是需要一番设计 , 设计理念的不同也导致了 InnoDB 和 MyISAM 的出现 , 各自呈现独特的性能 。
MyISAM 虽然数据查找性能极佳 , 但是不支持事务处理 。 InnoDB 最大的特色就是支持了 ACID 兼容的事务功能 , 而且他支持行级锁 。 MySQL 建立表的时候就可以指定引擎 , 比如下面的例子 , 就是分别指定了 MyISAM 和 InnoDB作为 user 表和 user2 表的数据引擎 。
大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技
本文插图

大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技
本文插图
执行这两个指令后 , 系统出现了以下的文件 , 说明这两个引擎数据和索引的组织方式是不一样的 。
大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技
本文插图
InnoDB 创建表后生成的文件有:

  • frm:创建表的语句;
  • idb:表里面的数据+索引文件 。
MyISAM 创建表后生成的文件有
  • frm:创建表的语句;
  • MYD:表里面的数据文件(myisam data);
  • MYI:表里面的索引文件(myisam index) 。
【大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技】从生成的文件看来 , 这两个引擎底层数据和索引的组织方式并不一样 , MyISAM 引擎把数据和索引分开了 , 一人一个文件 , 这叫做非聚集索引方式;InnoDB 引擎把数据和索引放在同一个文件里了 , 这叫做聚集索引方式 。 下面将从底层实现角度分析这两个引擎是怎么依靠 B+树这个数据结构来组织引擎实现的 。
1、MyISAM引擎的底层实现
MyISAM 用的是非聚集索引方式 , 即数据和索引落在不同的两个文件上 。 MyISAM 在建表时以主键作为 KEY 来建立主索引 B+树 , 树的叶子节点存的是对应数据的物理地址 。 我们拿到这个物理地址后 , 就可以到 MyISAM 数据文件中直接定位到具体的数据记录了 。
当我们为某个字段添加索引时 , 我们同样会生成对应字段的索引树 , 该字段的索引树的叶子节点同样是记录了对应数据的物理地址 , 然后也是拿着这个物理地址去数据文件里定位到具体的数据记录 。
大数据&云计算MySQL性能优化做得好的人,都懂的索引绝技
本文插图
2、Innodb引擎的底层实现
InnoDB 是聚集索引方式 , 因此数据和索引都存储在同一个文件里 。 首先 InnoDB 会根据主键 ID 作为 KEY 建立索引 B+树 , 如左下图所示 , 而 B+树的叶子节点存储的是主键 ID 对应的数据 , 比如在执行 select * from user_info where id=15 这个语句时 , InnoDB 就会查询这颗主键 ID 索引 B+树 , 找到对应的 user_name="Bob" 。


推荐阅读