专栏首页java 成神之路聚簇索引和二级索引

聚簇索引和二级索引

聚簇索引

索引和数据存储在一块( 都存储在同一个B*tree 中)。 一般主键索引都是聚餐索引

Mysql中InnoDB引擎的主键索引为聚簇索引,MyISAM存储引擎采用非聚集索引

非聚簇索引

索引数据和存储数据是分离的。

二级索引(辅助索引)

二级索引存储的是记录的主键,而不是数据存储的地址。

以Mysql的InnoDB为例 主键是聚集索引 唯一索引、普通索引、前缀索引等都是二级索引(辅助索引)

示例

下面我们通过一个具体的示例进行演示聚集索引和二级索引

pl_ranking(编程语言排行榜表)

该表包含3个字段,如下: id:主键 plname:编程语言名称 ranking:排名

id

plname

ranking

15

C

2

16

Java

1

18

Php

6

23

C#

5

26

C++

3

29

Ada

17

50

Go

12

52

Lisp

15

...

...

...

id: 设置主键 plname: 普通索引

聚簇索引(主键索引)

聚集索引

从图中我们可以看到,索引数据和存储数据都是在一颗树上,存在一起的。通过定位索引就直接可以查找到数据。

这棵树是根据主键进行创建的。 如果查找id=16的编程语言, select id, plname, ranking from pl_ranking where id=16; 则只需要读取3个磁盘块,就可以获取到数据。

二级索引(辅助索引)

image.png

从上图中我们发现,该B*tree根据plname列进行构建的,只存储索引数据,plname 和 id 的映射。

比如查找 编程语言为“Java”的数据。 select id, plname, ranking from pl_ranking where plname='Java'; 首先通过二级索引树中找到 Java 对应的主键id 为 “16”(读取2个磁盘块)。 然后在去主键索引中查找id为“16” 的数据。(读取3个磁盘块)

结论

select id, plname, ranking from pl_ranking where id=16; 根据主键查找只需要查找3个磁盘块 select id, plname, ranking from pl_ranking where plname='Java'; 根据编程语言名称查询需要读取5个磁盘块

结论一

通过上面的主键索引和非主键索引的例子我们可以得出: 主键索引(聚餐索引)查询效率比非主键索引查询效率更高。如果能使用主键查找的,就尽量使用主键索引进行查找。

结论二

从上面图中我们还可以分析得出以下结论: 主键定义的长度越小,二级索引的大小就越小,这样每个磁盘块存储的索引数据越多,查询效率就越高。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Tomcat connector 实现原理

    java404
  • 从零手写IOC

    java404
  • 深入理解 Synchronized

    java404
  • Mysql性能优化案例 - 覆盖索引

    场景 产品中有一张图片表,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: user_id 用...

    dys
  • MySQL索引原理以及查询优化

    一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,...

    yaphetsfang
  • 如何让MySQL索引更快一点?

    在 InnoDB 中,从二级索引回到主键索引查询数据,这个过程称作回表过程,而且这个回表过程是可以被优化的,这个优化就是利用覆盖索引。

    江南一点雨
  • 如何让mysql索引更快一点

    在 InnoDB 中,从二级索引回到主键索引查询数据,这个过程称作回表过程,而且这个回表过程是可以被优化的,这个优化就是利用覆盖索引。

    谭小谭
  • 一次分区大表索引整改的案例分析(上)

    在生产库上经常发现执行计划中索引选择不合适导致查询效率低下的情况,针对这种情况,我们可以采用重新收集统计信息(或设定统计信息)、绑定执行计划、增加hint写法(...

    IT大咖说
  • 我去,为什么最左前缀原则失效了?

    最近,在 mysql 测试最左前缀原则,发现了匪夷所思的事情。根据最左前缀原则,本来应该索引失效,走全表扫描的,但是,却发现可以正常走索引。

    烟雨星空
  • MySQL 索引与优化

    索引是存储引擎内部的一种数据结构,它能让数据库快速地找到需要的值,而不是野蛮地进行自上而下的全表遍历。索引对良好的性能非常关键,尤其是当表中的数据量越来越大时,...

    serena

扫码关注云+社区

领取腾讯云代金券