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分区表的索引也是全局的,与非分区表的索引一样,不支持单个分区的索引。所以没有分区表索引这一概念。
索引的存储结构
索引相关书箱推荐