风君雪科技博客

  • 首页
  • 业界
  • 前端
  • 运维
  • 建站
  • 软件
  • 生活
  • 后端
  • 创投
  • 运营
  • 程序人生
    • 影视
    • 游戏
    • 句子
    • 资源
  • 其他
    • 说说
  • 关于本站
  1. 首页
  2. 运维
  3. 正文

MySQL数据库回表与索引怎么理解

2023年3月25日 10点热度 0人点赞 0条评论

本篇内容介绍了“MySQL数据库回表与索引怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

回表的概念

先得出结论,根据下面的实验。如果我要获得['liu','25']这条记录。需要什么步骤。

  • 1.先通过['liu']记录对应到普通索引index(name),获取到主键id:4.

  • 2.再通过clustered index,定位到行记录。也就是上面说的这条['liu','25']记录数据。

因此,上述就是说的回表查询,先定位主键值,再定位行记录。多扫了一遍索引树。

当然,也就多耗费了CPU,IO,内存等。

1.stu_info表案例

create table stu_info (  id int primary key,  name varchar(20),  age int,  index(name) )

2.查看刚刚建立的表结构

mysql> show create table stu_info\G; *************************** 1\. row ***************************        Table: stu_info Create Table: CREATE TABLE `stu_info` (   `id` int(11) NOT NULL,   `name` varchar(20) COLLATE utf8_bin DEFAULT NULL,   `age` int(11) DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 1 row in set (0.00 sec)

3.插入测试数据

insert into stu_info values(1,'zhang',20); insert into stu_info values(4,'liu',25); insert into stu_info values(7,'huang',19); insert into stu_info values(10,'allen',27); insert into stu_info values(30,'benjiemin',27); insert into stu_info values(16,'roger',27);   insert into stu_info values(28,'peter',16); commit

4.分析过程

我们来分析这几条数据的索引。由于我们name这个列建立了索引。所以name索引存储会按照【a~z】顺序排列。通过select语句,可以得到一些感性认识。如下:

mysql> select name from stu_info; +-----------+ | name      | +-----------+ | allen     | | benjiemin | | huang     | | liu       | | peter     | | roger     | | zhang     | +-----------+

上述的普通索引secondary index在B+树存储格式可能如下:

根据旧金山大学提供的可视化B+tree的效果。

如下图:

MySQL数据库回表与索引怎么理解-风君雪科技博客

我在根据上面的图,画一个自己的。如下图所示:

MySQL数据库回表与索引怎么理解-风君雪科技博客

也能看到name这几个数据建立的B+树是怎么样的。也能看到我需要找到[liu]这个元素的话,需要两次查找。

但是,如果我的需求是,除了获取name之外还需要获取age的话。这里就需要回表了。为什么?因为我找不到age数据。

  • 普通索引的叶子节点,只存主键。

那么clustered index聚集索引是如何保存的呢?继续使用上述可视化工具,再分析一波。

MySQL数据库回表与索引怎么理解-风君雪科技博客

上图是聚集索引的示意图。转化为我的图如下:

MySQL数据库回表与索引怎么理解-风君雪科技博客

所以,name='liu'查询liu的年龄,是需要回表的。首先查询普通索引的B+树,再查询聚集索引的B+树。最后得到liu的那条行记录。

5.执行计划

我们也可以通过执行计划来分析一下,如下:

mysql> explain select id,name,age from stu_info where name='liu'\G; *************************** 1\. row ***************************            id: 1   select_type: SIMPLE         table: stu_info          type: ref possible_keys: name           key: name       key_len: 63           ref: const          rows: 1         Extra: Using index condition 1 row in set (0.00 sec)

看到Using index condition,我们这里用到了回表。

如果不取age,只取id和name的话,那么。就不需要回表。如下实验,继续看执行计划:

mysql> explain select id,name from stu_info where name='liu'\G; *************************** 1\. row ***************************            id: 1   select_type: SIMPLE         table: stu_info          type: ref possible_keys: name           key: name       key_len: 63           ref: const          rows: 1         Extra: Using where; Using index 1 row in set (0.00 sec)

那么,如果我们不想回表,不想多做IO的话。我们可以通过建立组合索引来解决这个问题。通过

ALTER TABLE stu_info DROP INDEX  name;   alter table stu_info add key(name,age);

我们再继续看执行计划,如下:

mysql> explain select name,age from stu_info where name='liu'\G; *************************** 1\. row ***************************            id: 1   select_type: SIMPLE         table: stu_info          type: ref possible_keys: name           key: name       key_len: 63           ref: const          rows: 1         Extra: Using where; Using index 1 row in set (0.00 sec)

可以看到额外信息是Using where; Using index而不是Using index condition也就没有用到回表了。

标签: mysql
最后更新:2023年3月25日

风君子

独自遨游何稽首 揭天掀地慰生平

点赞
< 上一篇
下一篇 >

猜你喜欢

  • 索引是什么?(什么是倒排索引)

  • 高性能MySQL(《高性能MySQL)

  • php连接mysql时怎么设置编码方式?

  • mysql中唯一索引的关键字是什么

  • mysql数据库如何创建数据表(Navicat创建数据库和表教程)

  • 详细解析mysql锁机制(超详细Redis入门教程)

  • 介绍MySQL复制表的几种方式(MySQL数据库面试题)

  • 异地容灾备份是什么意思?(最火的服务器容灾备份方案)

  • 怎么改mysql数据库的名字(mysql改用户名)

  • mysql出现错误代码1064的解决方法

  • mysql中的不等于符号有哪几种

  • mysql如何修改字段类型(Mysql修改字段名)

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

风君子

独自遨游何稽首 揭天掀地慰生平

最新 热点 随机
最新 热点 随机
华为培训的认证领域很广,包括路由交换、无线局域网、传送网、安全、统一通信、视讯、 路由三合一神器(三合一无线路由器哪个好) 路由器放这个位置(无线路由器装在哪个位置好) 网游名称551个 关于春回大地的句子有哪些 描写春回大地的句子集锦 爱听4G在哪里修改密码?密码修改方法图解 化妆品取名780个 VLAN之SVI与单臂路由(单臂路由和svi) 岳阳特产小吃能带走的 好听的墙绘工作室名字314个
手机屏幕变滑小妙招柒染当网名啥意思127个四月都有什么花开CPU中Cache是什么及组成结构介绍建筑工程一切险是什么?安全分析的几个好的工具网站的使用手机图片链接地址怎么获取python的源代码下载_官方下载python源码,编译linux版本的python「建议收藏」(Python.org)路由器六根天线怎么摆微软 Win11 虚拟桌面过渡动画回归,并添加切换提示
全球最贵油改电!劳斯莱斯闪灵已测试200万公里:首车今年一定交付 Steam 新一周销量榜:Steam Deck 连冠、《GTA5》及三部曲携《P3P》上榜 比亚迪在韩国推出首款车型 一辆卡车:配82kWh刀片电池 《暗黑2:重制版》离线破解及职业解锁MOD:惨遭暴雪封杀 命运战士2:双重螺旋秘籍-Soldier of Fortune 2: Double Helix秘籍 新浪私有化打的什么算盘? 李彦宏新书《智能交通》今日发行:5年内一线城市不再需要限购、限行 《阿凡达》续集到底何时上映?迪士尼给答案 首次申请信用卡该如何选择?信用卡小白必看三点 荣耀已与华为分家 华为申请“荣耀美肤”商标
标签聚合
小米 智能手机 网友 利息 华为 支付宝 电动车 贷款 快科技 教程 利率 中国 科技 信用 股票 来了 额度 秘籍 美国 股价 苹果 投资理财 处理器 手机 AMD 投资者 银行卡 业界 身份证 汽车 腾讯 芯片 iphone 游戏 程序 信用卡 旗舰 三星 微软 IT资讯 京东 银行 显卡 比亚迪 特斯拉 借款人 理财知识 马斯克 荣耀 余额

COPYRIGHT © 2023 风君雪博客园. ALL RIGHTS RESERVED.

粤ICP备2022155369号