MySQL中关键索引和重点索引概念的学习教程

MySQL中关键索引和重点索引概念的学习教程
主键

主键索引,称为主键,是主键,由一个或多个列组成,用于唯一地标识数据表中的记录。表可以没有主键,但最多只能有一个主键,主键值不包含null。

在MySQL中,我们通常遵循的InnoDB数据表的主键设计的几个原则:

不使用业务的自添加属性列用作主键。

主键字段的值始终没有更新,只有两种操作被添加或删除。

动态更新的类型,如当前的时间戳,没有被选择。

这样做的好处有以下几点:

当新的数据被添加,对InnoDB页分裂的概率是因为主键值的增加依次降低。我们可以参考以前的共享{ MySQL FAQ }系列--为什么InnoDB表推荐使用自添加列作为主键。

当业务数据发生变化时,主键值不能修改,减少在物理存储位置的变化的可能性,并在InnoDB页面碎片的概率也降低。

由于MyISAM表是一堆组织表,它可以在主键类型的设计很精致。

辅助索引是我们经常提到的索引,原索引是辅助索引,辅助索引也可以分为唯一索引,而不是唯一索引。

事实上,惟一的索引应该称为唯一约束,其功能是避免列或多列值的重复,它是一个约束索引。

在MyISAM引擎,唯一的指标是不是主要关键指标本质上是不同的,但核心价值为零的存在。换句话说,在MyISAM引擎,对空值的唯一索引是不允许的,它本质上是一个主键索引。

在InnoDB引擎,主要关键指标和辅助指标差别很大。主要的关键指标是作为一个聚集索引,而索引和普通辅助索引的存储是没有必要的,除了唯一性约束。

从查询的性能,在MyISAM表,查询性能的主键索引和唯一索引不允许空是等价的。In the InnoDB table, through a unique index query, it needs another transformation process from auxiliary index to primary key index.The lookup cost of InnoDB table based on ordinary index is higher, because after retrieving the result, it needs to search at least once more to confirm whether there are more eligible results. 主键索引和唯一索引不需要做。

经过测试,100万行数据的MyISAM是随机检索(整数型),主键和唯一索引的效率基本上是相同的,与普通索引检索效率比30%慢。对于InnoDB表,独特的指数是9%左右的效率比主键索引,和普通指数是50%比主键索引慢。
聚集索引

在MySQL的InnoDB引擎表是(集群)索引组织表(聚集索引组织表),而MyISAM引擎的表是堆组织表(堆组织表)。

聚合索引也称为聚类索引。

当然,聚合索引的概念并不是MySQL独有的,其他数据库系统也有。

总之,聚集索引是组织形式的关键索引,逻辑顺序索引决定了表行的物理存储顺序,而非聚集索引是索引,只需在一列数据上创建相应的索引,不影响整个表序列的物理存储。

让我们来看一下这两种存储方式的区别:

简单地说,物联网数据的物理存储顺序与主键索引是一致的,因此,如果新数据是离散的,那么数据块将是离散的而不是连续的,热表数据写入的顺序按写入时间顺序存储。

物联网表对热表的优点是:

范围查询效率较高;

当数据频繁更新(聚合索引本身未更新)时,生成片段并不容易。

它特别适合于一小部分热数据频繁地读写。

通过主键快速访问数据。

物联网表的缺点是:

如果数据变化是离散的,那么效率将比热表更差。
热表的缺点是:

索引表的阅读成本很高。
大多数数据是随机读取的,不能保证按顺序读取。
每个InnoDB表只能创建一个聚集索引,可以由一个或多个列。
如上所述,InnoDB是一个聚集索引组织表和聚集指数选择的规则是这样的:

首先,选择显式定义的主索引作为聚集索引。

如果没有,则选择不允许null的第一个索引;

如果不是,InnoDB引擎内置的rowid作为聚集索引。
可以看出,此索引结构的叶节点,该节点的关键值是主键的值,而该节点的值存储剩余的列数据和附加信息如rowid,回滚指针,TRX ID等等。

在这个图,结合上文,我们可以知道,在InnoDB表的聚集索引,相当于整个表,和整个表也是一个聚集索引,主键约束是聚集指数和聚集指数不一定是主键。

MyISAM是一堆组织表,它没有聚集索引的概念。

二者的比较

下面是一个简单的比较表

tag:索引学习教程重点关键

相关内容