没有合适的资源?快使用搜索试试~ 我知道了~
MySQL 回表(详细).doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 56 浏览量
2022-07-09
22:46:20
上传
评论
收藏 1.39MB DOC 举报
温馨提示
试读
11页
MySQL 回表(详细).doc
资源推荐
资源详情
资源评论
MySQL 回表
MySQL 回表
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
一、简述
回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主
键 ID 取出索引中未包含的数据。所以回表的产生也是需要一定条件的,如果一次索引查询
就能获得所有的 select 记录就不需要回表,如果 select 所需获得列中有其他的非索引列,
就会发生回表动作。即基于非主键索引的查询需要多扫描一棵索引树。
二、InnoDB 引擎有两大类索引
要弄明白回表,首先得了解 InnoDB 两大索引,即聚集索引(clustered index)和普通索
引(secondary index)。
聚集索引 (clustered index)
InnoDB 聚集索引的叶子节点存储行记录,因此, InnoDB 必须要有且只有一个聚集索引。
如果表定义了主键,则 Primary Key 就是聚集索引;
如果表没有定义主键,则第一个非空唯一索引(NotNULL Unique)列是聚集索引;
否则,InnoDB 会创建一个隐藏的 row-id 作为聚集索引;
普通索引(secondary index)
普通索引也叫二级索引,除聚簇索引外的索引都是普通索引,即非聚簇索引。
InnoDB 的普通索引叶子节点存储的是主键(聚簇索引)的值,而 MyISAM 的普通索引存
储的是记录指针。
三、回表示例
数据准备
先创建一张表 t_back_to_table,表中 id 为主键索引即聚簇索引,drinker_id 为普通索引。
CREATE TABLE t_back_to_table (
id INT PRIMARY KEY,
drinker_id INT NOT NULL,
drinker_name VARCHAR ( 15 ) NOT NULL,
drinker_feature VARCHAR ( 15 ) NOT NULL,
INDEX ( drinker_id )
) ENGINE = INNODB;
再执行下面的 SQL 语句,插入四条测试数据。
INSERT INTO t_back_to_table ( id, drinker_id, drinker_name, drinker_feature )
VALUES
( 1, 2, ‘广西-玉林’, ‘喝到天亮’ ),
( 2, 1, ‘广西-河池’, ‘白酒三斤半啤酒随便灌’ ),
( 3, 3, ‘广西-贵港’, ‘喝到晚上’ ),
( 4, 4, ‘广西-柳州’, ‘喝酒不吃饭’ );
NO 回表 case
使用主键索引 id,查询出 id 为 3 的数据。
EXPLAIN SELECT * FROM t_back_to_table WHERE id = 3;
执行 EXPLAIN SELECT * FROM t_back_to_table WHERE id = 3,这条 SQL 语句就不需
要回表。
因为是根据主键的查询方式,则只需要搜索 ID 这棵 B+ 树,树上的叶子节点存储了行
记录,根据这个唯一的索引,MySQL 就能确定搜索的记录。
回表 case
使用 drinker_id 这个索引来查询 drinker_id = 3 的记录时就会涉及到回表。
SELECT * FROM t_back_to_table WHERE drinker_id = 3;
因为通过 drinker_id 这个普通索引查询方式,则需要先搜索 drinker_id 索引树(该索引树
上记录着主键 ID 的值),然后得到主键 ID 的值为 3,再到 ID 索引树搜索一次。这个过程
虽然用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。
回表小结
对比发现,基于非主键索引的查询需要多扫描一棵索引树,先定位主键值,再定位行记录,
它的性能较扫一遍索引树更低。
在应用中应该尽量使用主键查询,这里表中就四条数据,如果数据量大的话,就可以明显
的看出使用主键查询效率更高。
使用聚集索引(主键或第一个唯一索引)就不会回表,普通索引就会回表。
四、索引存储结构
InnoDB 引擎的聚集索引和普通索引都是 B+Tree 存储结构,只有叶子节点存储数据。
新的 B+树结构没有在所有的节点里存储记录数据,而是只在最下层的叶子节点存储,上
层的所有非叶子节点只存放索引信息,这样的结构可以让单个节点存放更多索引值,增大
Degree 的值,提高命中目标记录的几率。
这种结构会在上层非叶子节点存储一部分冗余数据,但是这样的缺点都是可以容忍的,因
为冗余的都是索引数据,不会对内存造成大的负担。
聚簇索引
id 是主键,所以是聚簇索引,其叶子节点存储的是对应行记录的数据。
聚簇索引存储结构
剩余10页未读,继续阅读
资源评论
书博教育
- 粉丝: 1
- 资源: 2834
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功