热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jvm、树、数据库存储引擎知识总结

一、jvm相关

1、java执行流程以及五个运行时区

jvm、树、数据库存储引擎知识总结jvm、树、数据库存储引擎知识总结

程序计数器:当前线程所执行的字节码的行号指示器,为了线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器,互不影响,独立存储,我们称之为“线程私有”,他也是java虚拟机规范中没有规定任何oom情况的区域

虚拟机栈:线程私有,生命周期和线程相同,它是描述java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接等信息,每个方法从调用到执行完成的过程,就对应这一个栈帧在虚拟机栈中从入栈到出栈的过程

本地方法栈:与虚拟机栈是十分相似的,区别就是虚拟机栈执行的是java方法,本地方法栈则是为native方法服务,虚拟机栈和本地方法栈都可能抛出***Error和OutOfMemoryError异常。

:内存共享的区域,所有的对象实例和数组都要在堆上分配,几乎所有的对象都在这里分配,但随着JIP编译器的发展,技术逐渐成熟,栈上分配、标量替换优化技术会导致一些微妙的变化发生,这让所有的对象都在堆上分配变的不那么“绝对”了。

方法区:线程共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量等信息,虽然java虚拟机规范把方法去描述为堆的一个逻辑部分,但他还有一个别名Non-heap(非堆)目的就是和java堆分开。

二、树相关

二叉树、完全二叉树、平衡二叉树、b树、b+树

引言:二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗?答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。
所以,我们为了减少磁盘IO的次数,就你必须降低树的深度,将“瘦高”的树变得“矮胖”。

1、二叉树,每个节点最多有两个子树,左右子树是有顺序的,极端情况下顺序插入的元素可能是链表形式

jvm、树、数据库存储引擎知识总结jvm、树、数据库存储引擎知识总结

2、完全二叉树,首先它也是二叉树,简单描述就是除了最后一层外,其余各层节点数都达到最大,最后一层的节点都连续集中在左边。

3、平衡二叉树,它的左右两个子树的高度差的绝对值不超过1,(空树也是平衡二叉树,它只有一个根节点,左右子树都为0,0-0<1成立)

4、b树,全称Balance-tree(平衡多路查找树),平衡的意思是左右两边分布平衡,多路的意思是它不像二叉树,最多两个子节点,二路查找树,b树可以有多个节点。描述一颗 B树时需要指定它的阶数,阶数表示此树的结点最多多少个孩子结点(子树),一般用字母 M 表示阶数。(即遍观整棵树,子节点最多的个数是m,那么这棵树就是m阶树),所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;

b树中的每个节点保存的都是data数据,b+树只有叶子节点才存储数据data,非叶子节点只存储索引信息。

jvm、树、数据库存储引擎知识总结

jvm、树、数据库存储引擎知识总结

用上图为例,查询数值为5:第一次磁盘IO,在内存中比较 (与17,35比较)比17小,左子树,第二次磁盘IO

,在内存中定位(与8、12比较),比8小,左子树,第三次磁盘IO,在内存中定位(与3,5比较),找到5终止

5、b+树,是b树的变种,B+树只在叶子节点存储data,B+降低了树的深度,将“瘦高”的树变得“矮胖,有着比b树更高的查询效率,原因如下:

1. B+树中间节点没有卫星数据,只有索引,而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少 

2、其次,因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定。

b+树:

jvm、树、数据库存储引擎知识总结

三、数据库

一、myisam

1、myisam不支持事务,不支持外键,支持表锁,每次锁住的是整张表(表共享读锁和表独占写锁,读锁不会阻塞其他用户,写锁是独占锁,当有写操作时,会阻塞对同一表的读和写的操作),读锁和写锁和互斥的,读写操作时串行的,一个请求读操作同时另一个请求发起写操作,写操作会先获得锁,如果此时读操作已经在等待队列,写操作后进来,那么写操作也会插到读操作的前边,因为mysql认为写操作比读操作重要,如果有大量的更新操作和读操作的应用就不适用于myisam存储引擎,因为大量的更新操作会阻塞很久,查询操作很难获得锁。

2、myisam表有三个文件,索引文件,表结构文件,数据文件

3、采用非聚族索引,索引文件的数据域存储指向数据文件的指针。

jvm、树、数据库存储引擎知识总结

二、InnoDB

1、支持事物

事务具备四种特性:原子性、一致性、隔离性、持久性

事物的四种隔离级别

1、读未提交,事物A把number从10修改为了20,事物B读取了更新后的值20,此时事物A进行了回滚把number回滚到10,此时事物B读取到的值20就是脏读,怎么解决脏读?读提交就能解决

2、读提交,就是一个事物要等另一个事物提交后才能读取数据,这样就能避免了脏读,但事物A读取了number10,事物B把number修改为了20,此时事物A再去读发现和第一次的不一样,出现了不可重复读,怎么解决不可重复读?重复读

3、重复读,就是读取数据时(事物开启),不再允许修改操作,避免了不可重复读,但不可重复读对应的是修改,即UPDATE操作,但可能出现幻读问题,因为幻读对应的是INSERT,例如事物A读取了表中的数据,但此时事物B进行了INSERT插入操作,事物A再读时发现了多出了一些信息,怎么解决幻读?serializable序列化

4、序列化,它是最高的事物隔离级别,在改级别下,事物串行顺序执行,可以避免脏读、不可重复读、幻读,但这种效率低下,消耗性能

InnoDB存储引擎,默认主键

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址

jvm、树、数据库存储引擎知识总结

感谢 https://www.cnblogs.com/ubuntu1/p/8999403.html文章的帮助


推荐阅读
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
赖-哥_528
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有