mysql回表查询uuid_MySQL数据库回表与索引
[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数据库回表与索引相关推荐
- MySQL数据库应用 多表查询_mysql数据库-多表查询
今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: 数据库的创建 : create ...
- mysql 数据库分表查询_mysql数据库分表及实现
项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...
- oracle 闪回查询,闪回版本查询,闪回事务查询,闪回表,闪回删除,闪回数据库
文章目录 1. 闪回查询 1.1. 闪回时间查询 1.2. 闪回scn查询 (1) 获取scn号的方法 (2) 闪回scn查询命令 2. 闪回版本查询 3. 闪回事务查询 4. 闪回表 5. 闪回删除 ...
- 【MySQL】多表查询策略(多表联查子查询)
目录 一.MySQL多表查询 二.准备工作 1.运行环境 2.创建公司表 3.创建员工表 三.多表查询 (一)多表联查-同时查询多张表 1.联结 2.左连接 3.右连接 4.右连接 (二)子查询 1. ...
- 面向考试数据库—单表查询(包含建表数据)
面向考试数据库-单表查询(包含建表数据) 引言 ● 建立练习数据库(之后习题亦是基于该库) 建表源码 单表查询知识点汇总 单表查询练习题32道 (1)选取表中的若干列 (2)选择表中若干元祖 (3)o ...
- java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)
一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...
- 将联表查询简化为单表查询案例
目录 1.将联表查询简化为单表查询案例 1.1 问题描述 1.2 优化过程 1.2.1 将联表查询修改为单表查询 1.2.2 利用覆盖索引避免回表 1.将联表查询简化为单表查询案例 1.1 问题描述 ...
- php 多表查询输出,ThinkPHP多表查询
ThinkPHP多表查询处理 ThinkPHP多表连接查询处理 ThinkPHP关联查询(多表查询) 网上找到三种方法:table().join().原生SQL语句查询.(以下三种方法输出结果一致,并 ...
- SQL数据库误删除表数据恢复 SQL数据库truncate表数据恢复
SQL数据库误删除表数据恢复 SQL数据库truncate表数据恢复 误删除表需要恢复该表,要注意几个问题, 第一 删除表后是否新建表了 是否插入数据了. 第二 删除表后是否立即关闭SQL服务了/ 第 ...
最新文章
- [转]使用QT开发GoogleMap瓦片显示和下载工具
- 基于Python预测股价的那些人那些坑,请认真看完!
- Android之获取手机上的图片和视频缩略图thumbnails
- zuul默认的路由规则及禁用路由规则
- C# 制作Com组件:java调用.net DLL的方法
- Java——多线程实现的三种方式
- Shell脚本自动监控docker容器的状态
- C++远征之封装篇——字符串类型
- 【Aladdin Unity3D Shader编程】之三 光照模型(二)
- 又一个直播平台走到终点?官网无法访问疑似停服,主播讨要薪资
- 项目里面遇到的问题和解决方案的记录
- 常用的delphi 第三方控件
- VS工具使用技巧总结
- bounce buffer
- JSP实用教程(第二版)jsp源代码 word 免费
- java物流项目功能介绍_JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图...
- 西餐菜单怎么翻译成英文
- 一文汇总卡方检验分析步骤
- 用python计算偏导数
- 把自己录制的mp3音乐分享到朋友圈
热门文章
- python treemap_使用TreeMap
- OpenCV4每日一练day7:视频加载、摄像头调用、视频文件保存
- java 减少内存_java – 减少内存流失的方法
- c语言 字符串 正序再倒序_python字符串
- 手动配置 iis php环境,iis上手动配置php
- vue用form上传图片_vuejs使用FormData,ajax上传图片文件
- 计算机设计大赛作品评语,第九届大学生短片大赛获奖作品评语
- 思科模拟器叫什么_扫盲!通过型号快速识别思科路由器,交换机,服务器等设备...
- leetcode刷题:不同路径
- C++安全方向(三):3.7 使用openssl_evp接口完成SHA3和国密SM3