首页   快速返回

mysql innodb 索引原理
文章分类 mysql
发布时间 2019-03-06 修改时间 2019-03-06
聚集索引(clustered index)
innodb 索引组织表 
表中数据按照主键顺序存放
聚集索引  按主键顺序构造一颗B+树

叶子结点 存放数据 数据页

聚集索引的存储并不是物理上连续的,而是逻辑上连续的,叶子结点间按照主键顺序排序,通过双向链表连接。

多数情况下,查询优化器倾向于采用聚集索引,聚集索引能在叶子结点直接找到数据,并且数据逻辑有序,能快速范围查询。

一张表只能有一个聚簇索引。

Innodb中,聚簇索引默认就是主键索引。如果没有主键,则按照下列规则来建聚簇索引:
没有主键时,会用一个非空并且唯一的索引列做为主键,成为此表的聚簇索引;
如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

主键自增id, 写入性能较高。
uuid ,频繁的插入 频繁地移动磁盘块,写入性能比较低。

B+树(多路平衡查找树)
页大小16K (可配置)
IO操作  预读 一次性读取16k

一个节点能放n个值,n = 16K / 每个索引值的大小。
例如索引字段大小1Kb,每个节点能放的索引值理论上是16个
这种情况下,二叉树一次IO只能加载一个索引值,而B+树则能加载16个。

读磁盘性能慢,所以采用多路
B+树的路数为n+1 ,例如每个节点存放16个值,那么这棵树就是17路。

B+树节点可存储多个值,所以B+树索引并不能找到一个给定键值的具体行。
B+树只能找到存放数据行的具体页,然后把页读入到内存中,再在内存中查找指定的数据。

B树和B+树的区别
B+树的非叶子结点只包含导航信息,不包含实际的值,叶子结点见使用链表相连,便于区间查找和遍历。

辅助索引(次级索引 二级索引) Secondary Index



叶子结点存键值和聚集索引键

通过辅助索引来查找数据时,先通过辅助索引叶子节点获得主键索引的值,然后再通过主键索引找到完整的记录。

联合索引(组合索引) 唯一索引

Select * from user where age = ? ;
Select * from user where age = ? and name = ?;

create index idx_age_name on user(age, name)

覆盖索引 Covering index
select age,name from user where age=?

组合索引字段 包含了查询字段

索引列的数据长度越小越好

like 'a%' 会利用索引 , like '%a' 无法使用索引
Where 条件 in和or可以使用索引, not in 和 <> 无法使用索引


最左匹配原则

组合索引中精确匹配最左前列并范围匹配另外一列可以用到索引
组合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引

上一篇     下一篇
aql输出格式和TTL设置

aerospike使用truncate删除历史数据

zookeeper常用运维命令

innodb与myisam的区别

MySQL InnoDB存储结构

mysqldump使用说明