mysql 索引类型

mysql是索引组织表(IOT)

堆组织表(HOT)和索引组织表(IOT)的区别

 

mysql 索引功能

提高数据检查效率

提高表间的JOIN效率

唯一约束,保证数据一致

提高排序和分组效率

占用物理空间

数据变更时,索引也随之更新,效率低

 

索引创建时机

select 频繁的列

where 条件join的列

经常排序/分组的列

不建议创建索引的情况:基数低、更新频繁但查询不多,大字段(BLOB/TEXT),不怎么使用的列

 

 

 

主键索引

primary key,唯一标识一行记录,不能重复,不能为NULL

业务不能使用

不修改,少删除

最好自增,非自增列做主键会造成较严重的空间浪费

不使用随机值

 

 

聚集索引/Clustered index

一定程序决定数据的存储顺序,每张表只能有一个

TokuDB引擎可以有多个聚集索引,MyISAM 没有聚集索引

primary key 是聚集索引,但聚集索引不一定是主键索引;

innodb的表不要求必须有主键,但一定会有聚集索引,因为innodb是索引组织表

 

聚集索引优先选择列的条件

INT/BIGINT

数据连接(单调顺序)递增/自增

如果表中有主键,inndb会选择主键索引作为主键索引;

不建议的列:频繁修改、新增数据太过离散

 

innodb聚集索引选择次序

显式声明的主键

第一个NOT NULLABLE的唯一索引

ROWID(实例级/库级,6bytes)

 

索引后会自动增加主键值

索引的叶子节点,定义时不管是否包含了主键,都会自动存储主键值,用于回溯表。

alter table test add i1(c1,c2) 与alter test test add i1(c1,c2,id) 效果相同,innodb自动为每个索引涉及的字段的末尾增加了主键列;

 mysql5.6.9之后,优化器可自动识别索引末尾的值(index extensions)

 

唯一索引

唯一约束

可以为NULL

一个表可以有多个

唯一索引可以临时禁用,主键不可以

 

联合索引

多列组成,适合where条件中的多列组合

可用于避免回表(回表,索引上没有要查找的数据,需要通过主键找到整行数据,然后再读取需要的列)

将过滤性大的列放在联合索引的最左边,尽量在第一次过滤时,去除大量数据

mysql8.0开始支持倒序索引,联合索引中可支持不同的排序规则

 

覆盖索引

索引中包含全部要查询的列,不需要再通过主键去访问整行数据,即不需要回表;

执行计划中,Extra using index 

 

分区表索引

mysql分区表的索引也是全局的,与非分区表的索引一样,不支持单个分区的索引。所以没有分区表索引这一概念。

 

索引的存储结构

详见:Mysql索引底层数据结构与算法

 

索引相关书箱推荐

  • 保证正版 数据库索引设计与优化 (美)拉赫登迈奇,(美)利奇,曹怡倩,赵建伟 电子工业出版社
 
保证正版 数据库索引设计与优化 (美)拉赫登迈奇,(美)利奇,曹怡倩,赵建伟 电子工业出版社

 

posted @ 2021-04-20 16:47  方诚  阅读(433)  评论(0编辑  收藏  举报