MySQL简介、M有SQL的存储引擎、表、字段和数据

news2025/7/14 20:21:20

Java知识点总结:想看的可以从这里进入

目录

    • 2、MySQL特性介绍
      • 2.1、MySQL简介
      • 2.2、存储引擎
      • 2.3、表、字段、数据

2、MySQL特性介绍


2.1、MySQL简介

MySQL 是一个关系型数据库管理系统(RDBMS),于2009年被 Oracle 公司收购。它是一种关联数据库结构,将数据保存在不同的表中,而不是将所有数据放在一起,从而增加了速度并提高了灵活性。

在MySQL6开始MySQL分为两个版本:社区版(免费)和商业版(收费)。

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
  • MySQL 是可以定制的,采用了 GPL 协议,可以修改源码来开发自己的 MySQL 系统。
  • MySQL体积小、速度快、成本低、开源这些特点,导致越来越多的中小公司选择使用MySQL(Twitter、YouTube、美团等等)

其中 MySQL8有两个重要的版本,分别是:2015年发布的MySQL5.7 和2016年发布的MySQL8.0。尤其是8.0版本做了很多的增强,在源码上进行了重构,大大提高了其性能。

2.2、存储引擎

mysql有两种存储引擎:InnoDB、MyISAM。默认的为InnoDB。以读写插入为主的博客系统、新闻系统等使用MyISAM,增删改查都高,需要保证数据的完整性,并发量高,支持事务和外键的使用InnoDB

  • InnoDB(mysql5.5后默认使用的)

    • 数据存储格式:.frm文件存储表结构、.idb文件存储索引和数据
    • 锁:支持表锁和行锁,有四种隔离级别
      • 可重复读:可解决脏读、不可重复读,不能解决幻读
      • 读未提交(一个事务可以读取另一个未提交事务的数据):脏读、不可重复读,幻读均不能解决
      • 读已提交:解决脏读,不能解决不可重复读,幻读
      • 串行化:都可以解决
    • 事务和外键:支持事务、支持外键
      • begin:开始事务
      • rollback:回滚事务
      • commit:提交事务
    • 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值。因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引。最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
    • 内存:需要较大的内存,会建立专门的缓冲池用于高速缓冲数据和索引。
    • 数据保存顺序:按主键大小保存
  • MyISAM:

    • 数据存储格式:.frm文件存储表结构、.MYD存储表数据、.MYIs存储索引数据
    • 锁:只支持表锁,读取时加共享锁,写入时加排他锁。
    • 事务和外键:不支持事务、不支持外键
    • 采用非聚簇索引
    • 内存:可被压缩,存储空间较小
    • 数据保存顺序:按数据插入的顺序
  • 对比

    MYISAMINNODB
    事务支持不支持支持
    数据行锁定不支持(为表锁)支持
    外键约束不支持支持
    全文索引支持新版本支持
    表的空间大小较小大,约为2倍
    物理空间的存储.frm表结构定义文件
    .MYD 数据文件
    .MYI 索引文件
    数据库表中有一个*.frm文件
    及其上级目录下的ibdata文件

InnoDB 四大特性:

  1. 插入缓冲(insert buffer)

    ​ 索引是存储在磁盘上的,所以对于索引的操作需要涉及磁盘操作。如果我们使用自增主键,在插入主键索引时,不需要磁盘的随机 I/O。如果我们使用的是普通索引,大概率是无序的,此时就涉及到磁盘的随机 I/O,而随机I/O的性能是比较差的(磁盘顺序I/O的性能是磁盘随机I/O的4000~5000倍)。

    ​ 因此,InnoDB 存储引擎设计了 Insert Buffer ,对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池(Buffer pool)中,若在,则直接插入;若不在,则先放入到一个 Insert Buffer 对象中,然后再以一定的频率和情况进行 Insert Buffer 和辅助索引页子节点的合并操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚集索引插入的性能。

    ​ 插入缓冲的使用需要满足以下两个条件:1)索引是辅助索引;2)索引不是唯一的。

    ​ 因为在插入缓冲时,数据库不会去查找索引页来判断插入的记录的唯一性。如果去查找肯定又会有随机读取的情况发生,从而导致 Insert Buffer 失去了意义。

  2. 二次写(double write)

    ​ InnoDB 的的叶子节点一般是16kb,而操作系统写文件是以4kb作为单位,所以操作系统需要写4个块。如果数据在分块写的时候发生了某些异常,导致数据只要部分是写入成功的,这时会出现数据不完整的问题,而且这种问题无法通过日志进行恢复。

    ​ 这时就需要使用二次写。它两部分组成,一部分为内存中的 doublewrite buffer,其大小为2MB,另一部分是磁盘上共享表空间中连续的128个页,即2个区(extent),大小也是2M。

    ​ 先将脏数据复制到内存中的 doublewrite buffer,之后通过 doublewrite buffer 再分2次,每次1MB写入到共享表空间的磁盘上(顺序写,性能很高),完成后马上调用 fsync 函数,将doublewrite buffer中的脏页数据写入实际的各个表空间文件(离散写)。如果操作系统在将页写入磁盘的过程中发生崩溃,InnoDB 再次启动后,发现了一个 page 数据已经损坏,InnoDB 存储引擎可以从共享表空间的 doublewrite 中找到该页的一个最近的副本,用于进行数据恢复。

  3. 预读(read ahead)

    ​ 当 InnoDB 预计某些 page 可能很快就会需要用到时,它会异步地将这些 page 提前读取到缓冲池(buffer pool)中。InnoDB线性预读(linear read-ahead)(随机预读被废弃)

    ​ 线性预读:线性预读以 extent块为单位(1个 extent 等于64个 page),将下一个extent 提前读取到 buffer pool 中。它通过innodb_read_ahead_threshold控制执行预读操作的触发阈值,如果一个 extent 中的被顺序读取的 page 超过或者等于该参数变量时,Innodb将会异步的将下一个 extent 读取到 buffer pool中。

    ​ 随机预读:以 extent 中的 page 为单位,将当前 extent 中的剩余的 page 提前读取到 buffer pool 中。当同一个 extent 中的一些 page 在 buffer pool 中发现时,Innodb 会将该 extent 中的剩余 page 一并读到 buffer pool中,

  4. 自适应哈希索引

    ​ 哈希索引一般情况下查找的时间复杂度为 O(1),但是它不支持范围索引,所以InnoDB只是在热点数据等场景长自适应哈希索引。

    ​ InnoDB 会监控对表上索引的查找,如果观察到某些索引被频繁访问,变认为这些索是热数据,则对其建立哈希索引,自适应哈希索引通过缓冲池的 B+ 树构造而来,建立的速度很快,InnoDB 会自动根据访问的频率和模式来为某些页建立哈希索引。

2.3、表、字段、数据

关系型数据,都是由一张张的表组成的,而表中的每一行都是一条数据,每一列对应一个字段。每张表都有一个名字,用来标识自己,表名具有唯一性。

把数据库结构对应到Java中:

  1. 每一张表都对应Java中的一个类
  2. 每一个字段都对应了Java中的一个属性
  3. 每一行的数据都对应一个实体对象。

image-20230222151354602

image-20230222151944233

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计及绿证交易及碳排放的含智能楼宇微网优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MySQL语法之DDL数据定义语言(操作数据、数据表)

Java知识点总结:想看的可以从这里进入 目录3.4、SQL语言3.4.1、DDL数据定义1、操作数据库2、操作数据表3、约束3.4、SQL语言 SQL是结构化查询语言(Structured Query Language)的缩写,是一门标准的计算机语言,主要是用…

授人以渔command not found: ***

配置环境变量是每个开发人员绕不开的初级本领。搜了一下大多数博客都是列出自己系统配置的步骤,授人以鱼不如授人以渔,今天记录一下自己配置验证的方法过程,方便初学者配置。 本文围绕——我在macOS配置http-server的探究验证过程 1、下载 …

第52篇-小某书参数x-s分析【2023-02-24】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 一、前言 新网站改版好久了,今天来看看 aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tL2V4cGxvcmU=二、网站分析 打开一篇文章,查看下…

性能再提升、体验再升级,极米Z6X Pro重新定义轻薄与非凡

近年来,随着现代投影技术的更新与发展,智能投影仪似乎正在成为消费者们的日常必备产品。根据相关信息显示,中国已经成为消费电子产品的全球重要制造基地,尤其是智能投影仪产业正面临着前所未有的机遇。 作为国内智能投影行业的领导…

2023Java权威面试指南(Alibaba版),完爆“金三银四”

这次金三银四你准备好了吗? 莫慌莫慌,“面试造火箭,工作拧螺丝” 说得不无道理,偶然从朋友那得到的这份Alibaba内部疯传《Java权威面试指南(阿里版)》堪称精品,或可能助你一臂之力,…

【沐风老师】3DMAX一键楼梯脚本插件StairGenerator使用教程

3DMAX一键楼梯插件StairGenerator,不需要花费太多的时间,轻松从2D平面图生成3D楼梯模型,生成的楼梯模型细节丰富真实。 【主要功能】 1.简单:轻松实现2D到3D建模。 2.具有最详细三维结构的台阶平面图。 3.楼梯各部件完全参数化…

从0到1一步一步玩转openEuler--24 openEuler管理进程-调度启动进程

文章目录24 openEuler管理进程-调度启动进程24.1 定时运行一批程序(at)24.1.1 at命令24.1.2 设置时间24.1.3 执行权限24.2 周期性运行一批程序(cron)24.2.1 运行机制24.2.2 crontab命令24.2.3 crontab文件24.2.4 编辑配置文件操作…

SKB 套接字缓存

网络子系统中用来储存数据的缓存区叫做套接字缓存,简称SKB其与其他结构的关系如图示:

38-Golang中的继承

继承基本介绍和示意图 1.继承可以解决代码复用,让我们编程更加靠近人类思维 2.当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法 3.其他的结构体不需要重新定义这些属性(字…

TCP三次握手

参考:4.1 TCP 三次握手与四次挥手面试题 | 小林coding TCP 头格式 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 序列号:在建立连接时由计算机生成的随机数作为其初始值&#xff0c…

一、HTTP协议01

文章目录一、用户在浏览器中输入网址背后发生的事二、什么是HTTP三、HTTP和TCP/IP的关系四、HTTP的特点4.1、客户/服务模式4.2、简单快速4.3、灵活4.4、无连接4.5、无状态五、HTTP报文结构分析-请求报文六、HTTP报文结构分析-响应报文七、HTTP请求方法八、状态码一、用户在浏览…

【Spark分布式内存计算框架——离线综合实战】7.应用执行调度

第四章 应用执行调度 前面已经完成【广告数据ETL】和【业务报表分析】,在IDEA中使用本地模式LocalMode开发,从本地文件系统LocalFS加载数据,接下来打包发到测试集群环境测试,并且使用Oozie调度执行。 4.1 应用打包 在集群环境…

CS224W课程学习笔记(四):node2vec算法原理与说明

引言 什么是图嵌入? 我想从上节的deepwalk中已经有一个十分完整的轮廓了,这里引出deepwalk论文中的一张很形象的图(当然,上节的一些实战演练,也将这种嵌入关系进行了模拟与可视化,前文为:&…

项目管理工具dhtmlxGantt甘特图入门教程(十三):导出PDF和PNG格式

这篇文章给大家讲解dhtmlxGantt如何导出PDF和PNG格式。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是完善的甘特图图表库 DhtmlxGantt正版试用下载(qun 764148812)https://www…

浅谈人工智能(`AI`)基础知识

人工智能(AI)-基础知识 1. 什么是人工智能 1.1 人工智能基础定义 人工智能(英语:artificial intelligence,缩写为AI)亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。通常人工智能是指通过普通计算机程序…

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题(25分)2022上案例分析历年真题第二题(25分)2022上案例分析历年真题第…

3.4 Spring Boot 日志配置

第3章 Spring Boot 的系统配置 3.1 Spring Boot 系统配置文件 3.2 Spring Boot 自定义配置项 3.3 Spring Boot 其他配置 3.4 Spring Boot 日志配置 3.5 实战:Spring Boot 实现系统多环境配置 3.4 Spring Boot 日志配置 日志对于系统监控、故障定位非常重要&#xf…

Qt——Javascript/Qt交互、脚本化

Qt提供了对Javascript的良好支持, 如果查阅过文档你就知道Qt有两个不同的Js封装引擎: QScriptEngine QJSEngine QScriptEngine出现的比较早(自Qt4.3始),基于WebKit的JavaScriptCore引擎,提供的api相对来说比较丰富&a…

(一维、二维)数组传参,(一级、二级)指针传参【含样例分析,新手易懂】

目录数组传参一维数组传参二维数组传参指针传参一级指针传参二级指针传参我们在写代码的时候难免要把数组或者指针传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 数组传参 一维数组传参 我们首先来看下面代码的几个例子&#xff1a; #include <stdio.h>…