网易首页 > 网易号 > 正文 申请入驻

MySQL中100w数据表比1000w数据表查询更快吗?

0
分享至

当我们对一张表发起查询的时候,是不是这张表的数据越少,查询的就越快?

innodb逻辑存储结构

从Innodb存储引擎的逻辑存储结构来看,所有数据都被逻辑的放在一个表空间(tablespace)中,默认情况下,所有的数据都放在一个表空间中,当然也可以设置每张表单独占用一个表空间,通过innodb_file_per_table来开启。

mysql> show variables like 'innodb_file_per_table';
| Variable_name | Value |
| innodb_file_per_table | ON |
1 row in set (0.00 sec)

表空间又是由各个段组成的,常见的有数据段,索引段,回滚段等。因为innodb的索引类型是b+树,那么数据段就是叶子结点,索引段为b+的非叶子结点。

段空间又是由区组成的,在任何情况下,每个区的大小都为1M,innodb引擎一般默认页的大小为16k,一般一个区中有64个连续的页(64*16k=1M)。

通过段我们知道,还存在一个最小的存储单元页。它是innodb管理的最小的单位,默认是16K,当然也可以通过innodb_page_size来设置为4K、8K...,我们的数据都是存在页中的

mysql> show variables like 'innodb_page_size';
| Variable_name | Value |
| innodb_page_size | 16384 |
1 row in set (0.00 sec)

所以innodb的数据结构应该大致如下:


B+ 树

b+树索引的特点就是数据存在叶子结点上,并且叶子结点之间是通过双向链表方式组织起来的。

假设存在这样一张表:

CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL DEFAULT '',
`age` int(10) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
聚集索引

对于主键索引id,假设它的b+树结构可能如下:


  • 此时树的高度是2

  • 叶子节点之间双向链表连接

  • 叶子结点除了id外,还存了name、age字段(叶子结点包含整行数据)

我们来看看select * from user where id=30是如何定位到的。

  • 首先根据id=30,判断在第一层的25-50之间

  • 通过指针找到在第二层的p2中

  • 把p2再加载到内存中

  • 通过二分法找到id=30的数据

非聚集索引

通过表结构我们知道,除了id,我们还有name这个非聚集索引。所以对于name索引,它的结构可能如下:

  • 此时树的高度是2

  • 叶子节点之间双向链表连接

  • 叶子结点除了name外,还有对应的主键id

我们来看看select * from user where name=jack是如何定位到的。

  • 首先根据name=jack,判断在第一层的mary-tom之间

  • 通过指针找到在第二层的p2中

  • 把p2再加载到内存中

  • 通过二分法找到name=jack的数据(只有name和id)

  • 因为是select *,所以通过id再去主键索引查找

  • 同样的原理最终在主键索引中找到所有的数据

总结:name查询两次io,然后通过id再次回表查询两次io,加载到内存的时间忽略不计,总耗时是4次io。
一棵树能存多少数据

以上面的user表为例,我们先看看一行数据大概需要多大的空间:通过show table status like 'user'\G

mysql> show table status like 'user'\G
*************************** 1. row ***************************
Name: user
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 10143
Avg_row_length: 45
Data_length: 458752
Max_data_length: 0
Index_length: 311296
Data_free: 0
Auto_increment: 10005
Create_time: 2021-07-11 17:22:56
Update_time: 2021-07-11 17:31:52
Check_time: NULL
Collation: utf8mb4_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

我们可以看到Avg_row_length=45,那么一行数据大概占45字节,因为一页的大小是16k,那么一页可以存储的数据是16k/45b = 364行数据,这是叶子结点的单page存储量。

以主键索引id为例,int占用4个字节,指针大小在中占6字节,这样一共10字节,从root结点出来多少个指针,就可以知道root的下一层有多少个页。因为root结点只有一页,所以此时就是16k/10b = 1638个指针。

  • 如果树的高度是2,那么能存储的数据量就是1638 * 364 = 596232

  • 如果树的高度是3,那么能存储的数据量就是1638 * 1638 * 364 = 976628016

如何知道一个索引树的高度

innodb引擎中,每个页都包含一个PAGE_LEVEL的信息,用于表示当前页所在索引中的高度。默认叶子节点的高度为0,那么root页的PAGE_LEVEL + 1就是这棵索引的高度。

那么我们只要找到root页的PAGE_LEVEL就行了。

通过以下sql可以定位user表的索引的page_no:

mysql> SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO FROM information_schema.INNODB_SYS_INDEXES a, information_schema.INNODB_SYS_TABLES b WHERE a.table_id = b.table_id AND a.space <> 0 and b.name='test/user';
| name | name | index_id | type | space | PAGE_NO |
| test/user | PRIMARY | 105 | 3 | 67 | 3 |
| test/user | name | 106 | 0 | 67 | 4 |
2 rows in set (0.00 sec)

可以看到主键索引的page_no=3,因为PAGE_LEVEL在每个页的偏移量64位置开始,占用两个字节。所以算出它在文件中的偏移量:16384*3 + 64 = 49152 + 64 =49216,再取前两个字节就是root的PAGE_LEVEL了。

通过以下命令找到ibd文件目录

show global variables like "%datadir%" ;
| Variable_name | Value |
| datadir | /usr/local/var/mysql/ |
1 row in set (0.01 sec)

user.ibd/usr/local/var/mysql/test/下。

通过hexdump来分析data文件。

hexdump -s 49216 -n 10 user.ibd
000c040 00 01 00 00 00 00 00 00 00 69
000c04a

000c040 00 01 00 00 00 00 00 00 00 69

00 01就是说明PAGE_LEVEL=1,那么树的高度就是1+1=2

回到题目

100w的数据表比1000w的数据表查询更快吗?通过查询的过程我们知道,查询耗时和树的高度有很大关系。如果100w的数据如果和1000w的数据的树的高度是一样的,那其实它们的耗时没什么区别。

作者:假装懂编程 https://juejin.cn/post/6984034503362609165

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
潘粤明《白夜破晓》:37岁的她一出场,才知道什么是风韵犹存

潘粤明《白夜破晓》:37岁的她一出场,才知道什么是风韵犹存

陈述影视
2024-11-22 21:53:15
高射炮打蚊子?一枚上亿美元洲际导弹只炸死两个人,有人真怕了!

高射炮打蚊子?一枚上亿美元洲际导弹只炸死两个人,有人真怕了!

阿凫爱吐槽
2024-11-22 09:14:42
华裔球员天乐:中国方面联系过我,首选荷兰但我对其他选项开放

华裔球员天乐:中国方面联系过我,首选荷兰但我对其他选项开放

直播吧
2024-11-22 22:05:43
网传中铁建投资集团副总经理坠落身亡!

网传中铁建投资集团副总经理坠落身亡!

巴蜀法眼
2024-11-22 07:56:27
博主:“被俩无证无盔精神小妹”撞了,对方摇来十几个人,结局离大谱

博主:“被俩无证无盔精神小妹”撞了,对方摇来十几个人,结局离大谱

可达鸭面面观
2024-11-22 17:53:54
吴啸雷事件

吴啸雷事件

贴小君
2024-11-22 10:19:16
我国一口气又免签9个国家,1国意外上榜,美国又要着急了?

我国一口气又免签9个国家,1国意外上榜,美国又要着急了?

DS北风
2024-11-22 18:20:10
大震惊!!阿富汗突然宣布了!

大震惊!!阿富汗突然宣布了!

水雲鹤
2024-11-22 19:21:47
俄罗斯扔了一枚洲际导弹,搞笑的来了……

俄罗斯扔了一枚洲际导弹,搞笑的来了……

侃半仙
2024-11-21 22:03:40
南航要卖掉旗下全部787-8飞机,中外航司宽体机需求为何两重天|姗言两语

南航要卖掉旗下全部787-8飞机,中外航司宽体机需求为何两重天|姗言两语

第一财经资讯
2024-11-22 16:48:14
用12枚巡航导弹击伤“最高级别将军”!乌军这笔买卖划算吗

用12枚巡航导弹击伤“最高级别将军”!乌军这笔买卖划算吗

大风文字
2024-11-22 16:05:13
何炅KTV酒局视频曝光,被富婆搂肩很无奈,女方身份被扒地位显赫

何炅KTV酒局视频曝光,被富婆搂肩很无奈,女方身份被扒地位显赫

南城无双
2024-11-18 15:06:27
周冬雨颜值大变,眼角拉开脸上饱满,丑小鸭终于变白天鹅

周冬雨颜值大变,眼角拉开脸上饱满,丑小鸭终于变白天鹅

娱乐圈十三太保
2024-10-14 17:08:09
“特朗普对华鹰派内阁或有名无实”

“特朗普对华鹰派内阁或有名无实”

观察者网
2024-11-22 15:32:11
南航拟出售10架波音787-8型飞机

南航拟出售10架波音787-8型飞机

每日经济新闻
2024-11-22 10:31:14
前体操运动员下海做擦边!管晨辰评论区手撕,对方回应不耻反荣

前体操运动员下海做擦边!管晨辰评论区手撕,对方回应不耻反荣

小咪侃娱圈
2024-11-22 14:27:59
王艺迪3-1张本美和!总决赛女单4强出炉:国乒3人日乒全军覆没

王艺迪3-1张本美和!总决赛女单4强出炉:国乒3人日乒全军覆没

颜小白的篮球梦
2024-11-22 18:18:30
我们把“乱港分子”四十多人判刑之后,德国媒体非常愤怒!

我们把“乱港分子”四十多人判刑之后,德国媒体非常愤怒!

星辰故事屋
2024-11-22 20:32:46
不是救股市而是救经济,刘纪鹏谈救市“一盘棋”:银证保把股票置换给央行,“只能成功,不能失败”

不是救股市而是救经济,刘纪鹏谈救市“一盘棋”:银证保把股票置换给央行,“只能成功,不能失败”

界面新闻
2024-11-22 19:04:55
网红条纹哥遭全网封杀,在车展现场被参展商赶走,行为太低俗

网红条纹哥遭全网封杀,在车展现场被参展商赶走,行为太低俗

杨哥历史
2024-11-22 14:15:49
2024-11-23 06:55:00
Java精选
Java精选
一场永远也演不完的戏
1593文章数 3853关注度
往期回顾 全部

科技要闻

能者归来,蒋凡重回阿里电商权力中心

头条要闻

三孩时代 落马县委书记被点名"超计划生育二胎"

头条要闻

三孩时代 落马县委书记被点名"超计划生育二胎"

体育要闻

林诗栋横扫邱党晋级四强!喊话张本智和

娱乐要闻

受王宝强资助孩子父亲发声

财经要闻

祝宝良:增量政策可使明年GDP增长5%左右

汽车要闻

对话张纯伟:80万!捷途立了一个新Flag

态度原创

旅游
家居
本地
公开课
军事航空

旅游要闻

莲花山滑雪场向摄影界、新闻界免费开放!

家居要闻

线条装饰 打造设计空间感

本地新闻

云游中国 | 拒绝特种兵!北方也有“真江南”

公开课

一块玻璃,如何改变人类世界?

军事要闻

俄版"和平方案"披露:乌放弃加入北约

无障碍浏览 进入关怀版