MyISAM与InnoDB的索引差异

数据库的索引分为主键索引(Primary Index)与普通索引(Secondary Index)。InnoDB和MyISAM是怎么利用B+树来实现这两类索引的,又有什么差异呢?
一、MyISAM的索引
MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)。
其主键索引与普通索引没有本质差异:
  有连续聚集的区域单独存储行记录
  主键索引的叶子节点,存储主键,与对应行记录的指针
  普通索引的叶子节点,存储索引列,与对应行记录的指针
MyISAM的表可以没有主键。
主键索引与普通索引是两颗独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。
举个例子,MyISAM:
t(id PK,name KEY,sex,flag);
表中有四条记录:
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B


其B+树索引构造如上图:
  行记录单独存储
  id为PK,有一颗id的索引树,叶子指向行记录
  name为KEY,有一颗name的索引树,叶子也指向行记录

二、InnoDB的索引
InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引(Clustered Index):
  没有单独区域存储行记录
  主键索引的叶子节点,存储主键,与对应行记录(而不是指针),因此InnoDB的主键索引查询是非常快的
因为这个特性,InnoDB的表必须要有聚集索引:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个非空unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
聚集索引也只能够有一个,因为数据行在物理磁盘上只能有一份聚集存储。
InnoDB的普通索引可以有多个,它与聚集索引是不同的:
普通索引的叶子节点,存储主键(也不是指针)
对于InnoDB,这里的启示是:
(1)不建议使用较长的列做主键,例如char(64),因为所有的普通索引都会存储主键,会导致普通索引过于庞大;
(2)建议使用趋势递增的key做主键,由于数据行与索引一体,这样不至于插入记录时,有大量索引分裂,行记录移动;
仍是上面的例子,只是存储引擎换成InnoDB:
t(id PK, name KEY, sex, flag);
表中还是四条记录:
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B


其B+树索引构造如上图:
  id为PK,行记录和id索引树存储在一起
  name为KEY,有一颗name的索引树,叶子存储id
当:select * from t where name = ‘lisi‘;


会先通过name辅助索引定位到B+树的叶子节点得到id=5,再通过聚集索引定位到行记录。
所以其扫了两边索引树。

三、总结
MyISAM和InnoDB都使用B+树来实现索引:
  MyISAM的索引与数据分开存储
  MyISAM的索引叶子存储指针,主键索引与普通索引无太大区别
  InnoDB的聚集索引和数据行同一存储
  InnoDB的聚集索引存储数据行本身,普通索引存储主键
  InnoDB一定有且只有一个聚集索引
  InnoDB建议使用趋势递增整数作为PK,而不宜使用较长的列作为PK

本文学习自公众号“架构师之路”,感谢作者的奉献

原文地址:https://www.cnblogs.com/caohongchang/p/11618271.html

时间: 2024-10-11 04:56:32

MyISAM与InnoDB的索引差异的相关文章

了解MyISAM与InnoDB的索引差异(转)

出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引,其又有什么差异呢?这是今天要聊的内容. 一,MyISAM的索引 MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index). 其主键索引与普通索引没有本质差异: 有连续聚集的区域单独存储行记录 主键索引的叶子节点,存储主键,与对应行记录的指针 普

1分钟了解MyISAM与InnoDB的索引差异

一.MyISAM的索引 MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index). 其主键索引与普通索引没有本质差异: 有连续聚集的区域单独存储行记录 主键索引的叶子节点,存储主键,与对应行记录的指针 普通索引的叶子结点,存储索引列,与对应行记录的指针 画外音:MyISAM的表可以没有主键. 主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录. 举个例子,MyISAM: t(id PK, name KE

1分钟搞定 MyISAM与InnoDB的索引差异

B+树,它是一种非常适合用来做数据库索引的数据结构: (1)很适合磁盘存储,能够充分利用局部性原理,磁盘预读: (2)很低的树高度,能够存储大量数据: (3)索引本身占用的内存很小: (4)能够很好的支持单点查询,范围查询,有序性查询: ? 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引,其又有什么差异呢?这是今天要聊的内容. ? 一,MyISAM的索引 MyISAM的索引与行记录是分

MyISAM 和 InnoDB 中索引使用的区别

两个小型表 item.category: CREATE TABLE `item` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL, `category_id` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `category_id` (`category_id`) ) CH

MyISAM与InnoDB的索引实现

1.MyISAM 使用B+Tree 作为索引结构,叶子节点的data存放指针,也就是记录的地址.对于主键索引和辅助索引都是一样的.2.InnoDB 也使用B+Tree作为索引结构,也别需要注意的是,对于主键索引,InnoDB 使用聚集索引,InnoDB的数据文件本身就是就是索引文件.而MyISAM,主键索引和数据文件是分离的.3.InnoDB数据文件,要按主键聚集索引,这就要求InnoDB的表必须要有主键(MyISAM可以没有).如果没有显式指定主键,InnoDB会自动选择一个可以唯一标识记录的

MyISAM和InnoDB的索引在实现上的不同

1 MyISAM只把索引载入内存,数据缓存依赖于操作系统,InnoDB把索引和数据都载入内存缓冲 2 MyISAM数据库中的数据是按照插入的顺序保存,在每个索引节点中保存对应的数据行的地址,理论上说主键索引和其他索引是一样的,InnoDB数据库中的数据和主键节点保存在一起,所有其他索引节点中保存的是主键索引的值. 3 对于字符串索引,MyISAM默认采用增量保存,例如第一个索引值是'perform',第二个索引的值是'performance', 在索引文件中第二个索引被保存为'7,ance'.这

MySQL的MyISAM与InnoDB的索引方式

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意.可以看出MyISAM的索引文件仅仅保存数据记录的地址.在MyISAM中,主索引和辅助索引(Se

MyISAM和InnoDB在索引上的差别及其它区别

首先我们知道MyISM和InnoDB索引都是由B+树实现的,但在索引管理数据方式上却有所不同. InnoDB是聚集索引,数据文件是和(主键)索引绑在一起的,即索引 + 数据 = 整个表数据文件,通过主键索引到整个记录,必须要有主键,通过主键索引效率很高.但是辅助索引需要两次查询,因为辅助索引是以建索引的字段为关键字索引到主键,所以需要两次,先查询到主键,然后再通过主键查询到数据.因此,主键不应该过大,因为主键太大,其他索引也都会很大.话不多说上图: 主键索引:以主键索引到整条记录 辅助索引:以另

MyISAM和InnoDB索引实现对比

InnoDB 特点: 支持ACID事务(具有提交,回滚和崩溃恢复能力),支持存储过程,视图,支持行级锁定,支持外键,处理巨大数据量时拥有最大性能(可以说它的CPU效率是其他基于磁盘关系数据库引擎所不能匹敌的),表可以是任何尺寸,不支持全文类型的索引,插入缓冲.二次写.自适应哈希索引(三个特性详细介绍见: InnoDB的三个关键特性 (http://blog.csdn.net/z702143700/article/details/46049101). 应用场景: 以INSERT.UPDATE为主的