IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL& innoDB -> 正文阅读

[大数据]MySQL& innoDB

1.为什么生产环境中B+树的高度总是3-4层?

答案:一个高度为 3 的 B+ 树大概可以存放 1170 × 1170 × 16 = 21902400 行数据,已经是千万级别的数据量了,前提是每条数据只有1KB大小
解释:
在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是 512 字节,而文件系统的最小单元是块,一个块的大小是 4k,而对于我们的 InnoDB 存储引擎也有自己的最小储存单元——页(Page),一个页的大小是 16K
那么,InnoDB的一页,可以存放多少条数据呢?假设一条数据大小1KB,那么一个InnoDB的页可以存放16条数据;
Mysql中?个 Innodb?就是?个B+树节点
假设主键 ID 为 bigint 类型,占8字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。
一个高为3的B+树,其第一层,只能存放1170个指针;其前两层,可以存放11701170个指针;前两层有11701170个指针,可以指向1170*1170个dataNode,一个dataNode能放16条数据,所以这一棵树能存放1170 × 1170 × 16 = 21902400条数据,即2千多万条。

2.为什么要使用自增ID作为主键?

对InnoDB来说,主键索引是聚簇索引,既存储索引值,又在叶子节点中存储行的数据。如果主键自增,那么每次插入一条数据都会在当前索引的后续位置,当这一页达到装载因子时,InnoDB会开启新的一页。而如果主键非自增,无规律可循,那可以认为它是随机的,这样一来,完全随机的插入数据会导致大量的B+树分裂旋转,以及产生大量的空间碎片,浪费空间。

3.为什么使用数据索引能提高效率?

数据索引的存储是有序的。有序的数据结构的查找,可以用到二分的思想,其时间复杂度趋近于 log2(N)。

4.B+树索引和哈希索引的区别?

1.其底层依赖的数据结构不同,B+树索引是多叉平衡树,根据索引值的大小进行有序的存储;哈希索引是类似于哈希表的结构,其值的存放是无序的;
2.对于单个值的查询,哈希索引的复杂度为O(1);而B+树的时间复杂度为log(2)(m)*log(m)(n) = log(2)(n),用到了对数的换底公式;
3.哈希索引不支持范围查询;
4.哈希索引适用于大量等值查询的情况,而B+树索引适用于大多数情况。

5.B+树与B树的区别?

B树的每个节点存储了key和data。而B+树改进了B树, 让非叶子节点只存放key, 去掉了其中指向data的指针, 使得每个结点中能够存放更多的key, 因此能有更大的出度. 这样就意味着B+树的层高能进一步被压缩, 使得检索的时间更短。
由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历。

6.MySQL的联合索引?

联合索引是两个或更多个列上的索引。
假设有一个联合索引index(a,b,c),在索引建立的时候,是按照“如果a不相等,就按照a排序;否则,如果b不相等,就按照b排序,否则,就按照c排序”,因此,建立好的索引在全局上看,只有a是有序的,而b和c在全局上看都是无序的,只有a相同的时候,b才有序;a,b都有序的时候,c才有序。
注意:

下面几个会走索引
select * from test where a = ‘333’ and b = ‘333’ and c = ‘333’;
select * from test where b = ‘333’ and a = ‘333’ and c = ‘333’;
select * from test where c = ‘333’ and b = ‘333’ and a = ‘333’;
select * from test where a = ‘333’ and c = ‘333’;

而不遵循最左前缀原则的,就不会走索引。如:

select * from test where b = ‘333’ and c = ‘333’;

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 10:55:57  更:2021-09-10 10:57:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:06:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码