Mysql 索引
Posted Lemo_wd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 索引相关的知识,希望对你有一定的参考价值。
1.聚集索引与主键设计
InnoDB是一个聚集索引组织表,即行数据是按照聚集索引在物理磁盘上存储的,并且是块状结构,默认一个block是16kB。
每张InnoDB表只能创建一个聚集索引,聚集索引可以由一列或多列组成。它的聚集索引选择规则是这样的:
- 首先选择显式定义的主键索引做为聚集索引;
- 如果没有,则选择第一个不允许NULL的唯一索引;
- 还是没有的话,就采用InnoDB引擎内置的ROWID作为聚集索引;
在设计表结构时,表一定要显式定义主键,自增主键,或者联合主键,或全局ID。并且索引设置为NOT NULL,如果允许NULL,那么在索引的每条记录上,都要多用一个标记去记录这个列是否是NULL,占用多余的存储空间。
自增主键一般是int或bigint型。
全局ID跟自增ID特性基本相同,但是它的值是从另外的服务获取的数字增长类型,不要UUID。只在有分库(一般有全局统计需求),或其它可能需要全局唯一性的情况下才使用。在做数据迁移或拆库时,可以无缝切换,因为新旧数据id不用担心重复。定义全局ID时,注意字段范围要满足要求,小心溢出。
主键的设计原则:
- 采用一个没有业务用途的自增属性列作为主键;
- 主键字段值总是不更新,只有新增或者删除两种操作;
- 不选择会动态更新的类型,比如当前时间戳等。
这么做的好处有几点:
- 新增数据时,由于主键值是顺序增长的,innodb page发生分裂的概率降低了;
- 业务数据有变更时,不修改主键值,物理存储位置发生变化的概率降低了,innodb page中产生碎片的概率也降低了。
2.辅助索引
辅助索引,就是我们常规所指的索引,原文是SECONDARY KEY。辅助索引里还可以再分为唯一索引,非唯一索引。
对于唯一索引,查询时只是需要多一次从辅助索引到主键索引的转换过程。而对于普通索引的查找检索到结果后,还需要至少再多检索一次才能确认是否还有更多符合条件的结果。
以上是关于Mysql 索引的主要内容,如果未能解决你的问题,请参考以下文章