聚簇索引和二级索引

前段时间处理了一个mysql优化问题,涉及到聚簇索引和二级索引,今天来简单说下,因为我们的mysql用的是innodb索引,所以本文中都是以innodb索引为基础

先背书

聚簇索引

  • 聚簇索引通过表的主键构建一个B+tree树
  • 构建成的B+tree树叶子节点存放每一行的所有字段数据,也把叶子节点称为数据页
  • 每张表只能拥有一个聚簇索引
  • 如果没有定义主键,innodb会选择非空的唯一索引(第一个唯一索引)代替
  • 如果自定义主键和唯一索引都没有的话,innodb会生成一个隐式主键id,来做聚簇索引

二级索引

  • 也叫辅助索引或者非聚簇索引
  • 聚簇索引不一样的是,二级索引的叶子节点不存储行数据了,除了键值之外,还包含了相应行数据的聚簇索引对应列的值
  • 在查询二级索引时,先查询到叶子节点上相应行数据的聚簇索引对应列的值,再去查询聚簇索引查询到数据
  • 一张表可以有多个二级索引

直接上栗子

  • 用户类别表,主要有四个字段id(主键id), user_id(用户id), cate_id(用户类别), update_time(数据写入时间)
  • 索引的话,就id(主键id)创建一个主键索引,user_id(用户id) 和 cate_id(用户类别)创建一个联合索引,建表语句如下:
CREATE TABLE `t_user_cate` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
  `cate_id` varchar(20) NOT NULL COMMENT '用户类别ID',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据插入/更新时间(会自动更新,不需要刻意程序更新)',
  PRIMARY KEY (`id`),
  KEY `idx_user_cate_id` (`user_id`,`cate_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='写文章使用,用户类别表'
  • 插入过程略

t_user_cate表的聚簇索引展示

  • 因为有创建了id为主键索引,所以 t_user_cate表的聚簇索引在字段id上的

  • 聚簇索引B+tree的示例如下:


    聚簇索引
  • 如图来看

  • 叶子节点使用单链表链接,按id列递增链接,方便基于范围的顺序检索

  • 聚簇索引的叶子节点存储完整一行表数据,每个聚簇索引下都是每一行的完整数据

  • 通过主键id查询时候,因为叶子节点已经存储了完整的每一行的数据,查询的效率非常高

t_user_cate表的二级索引展示

  • 画图时忽略联合索引idx_user_cate_id,因为图不上不好画,我就直接画成单索引
  • 二级索引B+tree的示例如下:
二级索引
  • 二级索引的叶子节点,存储聚簇索引所在列的值,最后通过查询到聚簇索引列的值再去回表查询

回表查询

  • 说下回表查询
  • 因为二级索引叶子节点不像聚簇索引那样,不存储完整的行数据,存储的是聚簇索引所在列的值,所以还需要通过查询到的值查询聚簇索引,是会损耗一点性能的
  • 比如说这个sql
SELECT
  *
FROM
  t_user_cate
where
  user_id = 1123
  • 回表查询如下:
回表查询
  • 查询过程如下:
  • 第一步:通过二级索引user_id查询,user_id=1123,查询到叶子节点,存储的是聚簇索引列id查询到对应的id列的值为1
  • 第二步:通过上一步查询到的id=1,再来查询聚簇索引查询到所涉及到所有行的数据

回表的两种情况

  • 查询二级索引时候,回表不是必要步骤
  • 当你查询的所有字段都是索引字段时,这时候不需要进行回表查询,例如:
SELECT
  user_id,
  cate_id
FROM
  t_user_cate
where
  userid = 1123
  • 查看该sql的执行计划:


    不需要回表查询的执行计划
  • 注意最后一列Extra,值是Using index,代表查询的字段是索引覆盖的,所以本次查询没有进行回表查询

  • 当你查询的字段有的不在索引范围内,这时候就会进行回表查询,例如:

SELECT
  user_id,
  cate_id,
  update_time 
FROM
  t_user_cate
where
  userid = 1123
  • 这次查询字段多增了一个update_time字段,本字段不在索引中,再来看执行计划:
需要回表查询的执行计划
  • 对于上一个sql的执行计划,执行计划中的字段基本和上一个sql一致,只有Extra字段不一样,本次执行计划中Extra字段为空,说明没有索引覆盖查询需要走回表查询

聚簇索引优缺点总结

  • 通过上面例子,我们来总结一下聚簇索引的优缺点

优点

  • 数据查询效率高,因为聚簇索引构建的B+tree的叶子节点存放完整的行数据,所以通过聚簇索引查询比二级索引查询速度快
  • 基于主键的排序查找、范围查找效率高

缺点

  • 数据写入时候,比较依赖于主键的顺序插入,所以都需要我们自定义一个自增主键
  • 更新主键的代价很高,会导致被更新的行移动

聚簇索引和二级索引说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识,愿大家没有bug,谢谢!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容