[TOC]

回表的概念

先得出结论,根据下面的实验。如果我要获得['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

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的效果。

其可视化地址为:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

如下图:

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

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

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

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

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

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

所以,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

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

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

row in set (0.00 sec)

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

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[MySQL数据库回表与索引]http://www.zyiz.net/tech/detail-136029.html

mysql回表查询uuid_MySQL数据库回表与索引相关推荐

  1. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  2. mysql 数据库分表查询_mysql数据库分表及实现

    项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...

  3. oracle 闪回查询,闪回版本查询,闪回事务查询,闪回表,闪回删除,闪回数据库

    文章目录 1. 闪回查询 1.1. 闪回时间查询 1.2. 闪回scn查询 (1) 获取scn号的方法 (2) 闪回scn查询命令 2. 闪回版本查询 3. 闪回事务查询 4. 闪回表 5. 闪回删除 ...

  4. 【MySQL】多表查询策略(多表联查子查询)

    目录 一.MySQL多表查询 二.准备工作 1.运行环境 2.创建公司表 3.创建员工表 三.多表查询 (一)多表联查-同时查询多张表 1.联结 2.左连接 3.右连接 4.右连接 (二)子查询 1. ...

  5. 面向考试数据库—单表查询(包含建表数据)

    面向考试数据库-单表查询(包含建表数据) 引言 ● 建立练习数据库(之后习题亦是基于该库) 建表源码 单表查询知识点汇总 单表查询练习题32道 (1)选取表中的若干列 (2)选择表中若干元祖 (3)o ...

  6. java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...

  7. 将联表查询简化为单表查询案例

    目录 1.将联表查询简化为单表查询案例 1.1 问题描述 1.2 优化过程 1.2.1 将联表查询修改为单表查询 1.2.2 利用覆盖索引避免回表 1.将联表查询简化为单表查询案例 1.1 问题描述 ...

  8. php 多表查询输出,ThinkPHP多表查询

    ThinkPHP多表查询处理 ThinkPHP多表连接查询处理 ThinkPHP关联查询(多表查询) 网上找到三种方法:table().join().原生SQL语句查询.(以下三种方法输出结果一致,并 ...

  9. SQL数据库误删除表数据恢复 SQL数据库truncate表数据恢复

    SQL数据库误删除表数据恢复 SQL数据库truncate表数据恢复 误删除表需要恢复该表,要注意几个问题, 第一 删除表后是否新建表了 是否插入数据了. 第二 删除表后是否立即关闭SQL服务了/ 第 ...

最新文章

  1. [转]使用QT开发GoogleMap瓦片显示和下载工具
  2. 基于Python预测股价的那些人那些坑,请认真看完!
  3. Android之获取手机上的图片和视频缩略图thumbnails
  4. zuul默认的路由规则及禁用路由规则
  5. C# 制作Com组件:java调用.net DLL的方法
  6. Java——多线程实现的三种方式
  7. Shell脚本自动监控docker容器的状态
  8. C++远征之封装篇——字符串类型
  9. 【Aladdin Unity3D Shader编程】之三 光照模型(二)
  10. 又一个直播平台走到终点?官网无法访问疑似停服,主播讨要薪资
  11. 项目里面遇到的问题和解决方案的记录
  12. 常用的delphi 第三方控件
  13. VS工具使用技巧总结
  14. bounce buffer
  15. JSP实用教程(第二版)jsp源代码 word 免费
  16. java物流项目功能介绍_JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图...
  17. 西餐菜单怎么翻译成英文
  18. 一文汇总卡方检验分析步骤
  19. 用python计算偏导数
  20. 把自己录制的mp3音乐分享到朋友圈

热门文章

  1. python treemap_使用TreeMap
  2. OpenCV4每日一练day7:视频加载、摄像头调用、视频文件保存
  3. java 减少内存_java – 减少内存流失的方法
  4. c语言 字符串 正序再倒序_python字符串
  5. 手动配置 iis php环境,iis上手动配置php
  6. vue用form上传图片_vuejs使用FormData,ajax上传图片文件
  7. 计算机设计大赛作品评语,第九届大学生短片大赛获奖作品评语
  8. 思科模拟器叫什么_扫盲!通过型号快速识别思科路由器,交换机,服务器等设备...
  9. leetcode刷题:不同路径
  10. C++安全方向(三):3.7 使用openssl_evp接口完成SHA3和国密SM3