Mysql基础速过

一、数据库相关概念

1.1 相关概念

名称全称简称
数据库存储数据的仓库、数据是有组织的进行存储DataBase(DB)
数据库管理系统操作和管理数据库的大型软件DataBase Management System(DBMS)
SQL操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准Structured Query Language(SQL)

image.png

image.png

客户端连接

系统自带的命令行工具执行命令:mysql [-h 127.0.0.1] [-P 3306] -u root - p

1.2 关系型数据库(RDB)

建立在关系模型的基础上,由多张相互连接的二维表组成的数据库。

特点:

  1. 使用表存储数据,格式统一,便于维护;
  2. 使用SQL语言操作,标准统一,使用方便。

二、SQL语句

2.1 SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾;
  2. SQL语句可以使用空格/缩进来增强语句的可读性;
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
  4. 注释:
    • 单行注释:-- 或 #
    • 多行注释:/* */

2.2 SQL分类

分类全称说明语句
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库、表、字段)Show/Create/Drop/Alter
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改insert/delete/update
DQLData Query Language数据查询语言,用来查询数据库中表的记录select
DCLData Control Language数据控制语言,用来创建数据库用户,控制数据库的访问权限Create/Drop/Alter

三、约束

约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的是为了保证,数据库中数据的正确性、有效性和完整性。

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一的、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

外键约束

  1. 添加外键
    create table 表名(字段名 数据类型,……constraint (外键名称) foreign key(外键字段名) references 主表(主表列名));alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
  1. 删除外键

    alter table 表名 drop foreign key 外键名称;

当删除或更新外键时,数据库可以执行的行为。

image.png

默认是 no action/restrict

设置行为:

alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名) on update cascade on delete cascade;

四、事务

事务是一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

4.1 事务的操作

4.1.1 方式一

  1. 查看/设置事务提交方式

    select @@autocommit;

    set @@autocommit=0;

  2. 提交事务

    commit;

  3. 回滚事务

    rollback;

默认mysql的事务是自动提交的,也就是说,当执行一条DML语句,mysql会立即隐式的提交事务。

我们可以通过设置@@autocommit=0,改成手动提交事务。

当我们执行完所有sql语句后,执行commit命令,如果中间出现异常,可以使用rollback回滚事务。

4.1.2 方式二

  1. 开启事务

    start transaction 或 begin;

  2. 提交事务

    commit;

  3. 回滚事务

    rollback;

4.2 事务的四大特性(ACID)

  • 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性:事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性:事务一旦提交或回滚,它对数据库中数据的改变就是永久的。

4.3 事务的并发问题

问题描述
脏读一个事务读到另一个事务还没有提交的数据。
不可重复读一个事务先后读取同一条记录,但两次读取到的数据不同,称之为不可重复读。
幻读原来不存在的数据行,现在存在了。一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影。

4.4 事务的隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read××
Serializable×××
  1. 读未提交:就是可以读取到其他事务还没有提交的数据,会出现三种并发问题。

  2. 读已提交:读取其他事务已经提交的数据,虽然可以解决脏读问题,但是,不能解决不可重复读问题,因为如果其他事务的提交正好处于本事务的两次查询之间,就导致两次查询的结果不一致。不可重复读并不是指你不能读两次,而是指你读两次结果不一致,是一种无效的读。

  3. 可重复读:是指在同一个事务中,不管读多少次,结果都是和第一次一样。这样也会导致新的问题就是幻读,由于同一个事务中查询多少次都是和第一次一样,那么如果有新的事务在这个过程中插入了新数据,我们还是查不到的。

  4. 串行化:终极大杀器,如果当前事务还没有执行完,其他事务必须排队等候。

mysql默认是Repeatable Read

查看事务的隔离级别

select @@transaction_isolation

设置事务的隔离级别

set [session|global] transaction isolation level {Read uncommitted|Read committed|Repeatable Read|Serializable}

  • session:会话级别,仅对当前客户端窗口有效;
  • global:全局级别,针对所有客户端窗口有效。

注意:事务的隔离级别越高,数据越安全,但是性能越低。

4.5 当前读和快照读

当前读:读取最新的数据,而不是历史版本的数据。加锁的select、insert、update、delect。

快照读:读取的是快照数据。普通的select操作。

4.6 事务隔离性的实现

  1. 读写锁

    最简单的事务隔离实现方式。每次读操作需要获取一个共享锁,每次写操作需要获取一个写锁。

    共享锁之间不产生互斥,共享锁和写锁之间以及写锁与写锁之间会产生互斥。

  2. MVCC(多版本并发控制)

    在读写锁中,读和写的排斥作用大大降低了事务的并发效率,于是人们又提出了能不能让读写之间也不冲突的方法,就是读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了。不同的事务 session会看到自己特定版本的数据,即使其他的事务更新了数据,但是对本事务仍然不可见,本事务看到的数据始终是第一次查询到的数据。在数据库中,这个快照的处理方式叫多版本并发控制(Multi-Version Concurrency Control)。这种方式真正实现了非阻塞读,只有在写操作时才需要加行级锁,因此并发效率更高。

五、存储引擎

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

CREATE TABLE `account` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',`name` varchar(10) DEFAULT NULL COMMENT '姓名',`money` int DEFAULT NULL COMMENT '余额',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='账户表'

mysql的默认存储引擎是InnoDB。

查看当前数据库支持的所有存储引擎:show engines;

5.1 存储引擎的特点

5.1.1 InnoDB

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在mysql5.5之后,成为了mysql的默认存储引擎。

特点:

  1. DML操作遵循ACID模型,支持事务
  2. 行级锁,提高并发访问性能;
  3. 支持外键Foreign key 约束,保证数据的完整性和正确性。

文件:

xxx.ibd:xxx代表表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构、数据和索引。

image.png

5.1.2 MyISAM

MyISAM是mysql早期的默认存储引擎。

特点:

  1. 不支持事务、不支持外键;
  2. 支持表锁,不支持行锁;
  3. 访问速度快。

5.1.3 Memory

存储在内存中的,由于会受到硬件问题、或断电问题的影响,只能将这些表作为临时表或者缓存使用。

特点:

  1. 内存存放;
  2. hash索引(默认)。

文件:xxx.sdi 存储表结构信息。

image.png

5.2 存储引擎的选择

image.png

六、索引

6.1 索引

索引(index)是帮助Mysql高效获取数据的数据结构(有序)。

image.png

优缺点

优势劣势
提高数据检索的效率,降低数据库的IO成本索引列也要占用空间
通过索引列对数据进行排序,降低数据排序的成本,降低cpu的消耗索引大大提高了查询效率,同时却降低更新表的速度,如对表进行增删改时,效率低。

索引结构

mysql的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

索引结构描述
B+Tree最常见的索引类型,大部分引擎都支持
Hash底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
R-tree(空间索引)MyISAM引擎的一种特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式,类似于Lucene、solr、ES

6.2 B-Tree

image.png

B-Tree(多路平衡查找树)

下面这棵树的度为5,树的度指的是一个节点的子节点的个数。

B-Tree的构建过程:一个节点存放度数-1个key(数据),超过这个数的时候,节点会向上分裂,将中间元素移动到父节点中。

image.png image.png

插入2456时变成下面这样子:

image.png

B Tree的每一个节点中存放数据和索引。

6.3 B+Tree

image.png

红色框里面的是存放的数据,绿色框里面的数据起到索引的作用。

叶子节点之间形成一个单向链表。

B+Tree向上分裂的时候,分裂节点同时也会保留在叶子节点中,并在叶子节点之间形成链表。

image.png

Mysql的索引数据结构对经典的B+Tree进行了优化。在原来的基础上,形成了双向链表,并且首尾相连。

image.png

6.4 哈希索引

image.png

hash索引的特点:

  1. 只能用于对等比较(=,in),不支持范围查询(between,>,<);
  2. 无法利用索引完成排序操作;
  3. 查询效率高,通常只需要一次检索就可以,效率通常高于B+tree。

6.5 思考

为什么InnoDB选择B+tree?

  1. 相对于二叉树,层级更少,搜索效率更高;
  2. 对于B-tree,无论是叶子节点还是非叶子节点,都是保存在page中的,innodb的page大小为16k,如果采用BTree,会导致一页可存储的键值减少,指针跟着减少,要保存同样的数据时,只能增加树的高度,导致性能降低;
  3. 相对于hash索引,B+Tree支持范围匹配和排序操作。

6.6 索引的分类

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建,只能有一个primary
唯一索引避免同一个表中某数据列中的值重复可以有多个unique
常规索引快速定位特定数据可以有多个
全文索引查找文本中的关键词,而不是比较索引中的值可以有多个fulltext

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

分类含义特点
聚集索引将数据存储与索引放到一起,索引结构的叶子节点保存了行数据必须有,且只有一个
二级索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以有多个

聚集索引选取规则:

  1. 如果存在主键,主键索引就是聚集索引;
  2. 如果不存在主键,将使用第一个唯一索引;
  3. 如果这两都没有,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

image.png

回表查询:查询时如果使用的不是聚集索引,就需要先查询二级索引,根据二级索引的结果,再去聚集索引中查找。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer&#xff1f;引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理&#xff08;TagData分析&#xff09;关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…

科研绘图系列:R语言微生物堆积图(stacked barplot)

介绍 堆叠条形图是一种数据可视化图表,它通过将每个条形分割成多个部分来展示不同类别的数值。每个条形代表一个总体数据,而条形内的每个部分则代表该总体数据中不同子类别的数值。这种图表特别适合展示整体与部分的关系,以及各部分在整体中的比例。 特点: 多部分条形:每…

Python爬虫:代理ip电商数据实战

引言&#xff1a;数据访问管理引发的烦恼 作为一名Python博主&#xff0c;爬虫技能对于获取和分析数据至关重要&#xff0c;经常爬一下&#xff0c;有益身心健康嘛。爬虫技术对很多人来说&#xff0c;不仅仅是一种工具&#xff0c;更像是一种艺术&#xff0c;帮助我们从互联网…

工程视角:数据结构驱动的应用开发--字典(dictionary),列表(list)与实体

这里写目录标题 业务业务场景流程分析 实现数据访问层&#xff08;DAL&#xff09;业务逻辑层&#xff08;BLL&#xff09;用户界面层&#xff08;UI&#xff09;工具类 设计思路为什么抽出工具类关于U层使用字典的好处工程视角 业务 业务场景 在一个金融应用系统中&#xff0c…

【益智问题】十三球称重

十三球称重 问题描述解决方案 问题描述 有13个外表一模一样的小球产品&#xff0c;其中有一个是次品&#xff0c;其质量与其他12个略有差别&#xff0c;但不知道是重还是轻。这13个球上都有标号&#xff0c;现在给你-架天平&#xff0c;只能使用三次&#xff0c;把这个次品小球…

Elasticsearch:Golang ECS 日志记录 - zap

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。 编码器以 JSON 格式记录日志&#xff0c;并在可能的情况下依赖默认的 zapcore/json_encoder。它还处理 ECS 错误格式的错误字段记录。 默认情况下&#xff0c;会添…

58、主从复制数据库+读写分离

mysql的主从复制和读写分离&#xff08;面试问原理&#xff09; mysql的主从复制和读写分离&#xff1a; 主从复制 面试必问 主从复制的原理。 读写分离&#xff0c;MHA 一、主从复制 1.1、主从复制的模式&#xff1a; 1、mysql的默认模式&#xff1a; 异步模式&#xf…

Three.js 官方文档学习笔记

Address&#xff1a;Three.js中文网 (webgl3d.cn) Author&#xff1a;方越 50041588 Date&#xff1a;2024-07-19 第一个3D案例—创建3D场景 创建3D场景对象Scene&#xff1a; const scene new THREE.Scene(); 创建一个长方体几何对象Geometry&#xff1a; const geomet…

FTP、NFS、SAMBA系统服务

⼀、rsync托管xinetd 1 、为什么要进⾏服务托管 独⽴服务&#xff1a;独⽴启动脚本 ssh ftp nfs dns ... 依赖服务 : 没有独⽴的启动脚本 rsync telnet 依赖 xinetd 服务&#xff08;独⽴服务&#xff09; 2 、如何将 rsync 托管给 xinetd 服务去管理&#xff1f; 第⼀步&am…

VMware中Ubuntu磁盘空间的清理

最近发现Ubuntu占用空间过大&#xff0c;在网上找了一些方法&#xff0c;在这里总结一下。 1.删除快照 把不需要的快照删除&#xff0c;但要注意删除快照可能会影响到后续的快照链。每个快照依赖于前面的快照。如果删除一个中间快照&#xff0c;虚拟机可能无法找到完整的差异…

leetcode 513.找树左下角的值

1.题目要求: 代码块: 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。2.此题思路: 1.创建队列&#xff0c;出队函数和入队函数: //创建队列 typedef struct queuet{struct TreeNode* value;struct queue* n…

IB user verbs介绍

本文来自对内核源代码文档/Documentation/infiniband/user_verbs.rst的翻译和理解。 在Infiniband设备帮助下&#xff0c;跨计算机的两个进程可以相互访问对方的虚地址空间。在Linux操作系统上&#xff0c;支持进程能直接访问本地Infiniband设备的资源&#xff0c;从而实现跨机…

TeamViewer手机端APP提示:请先验证账户

当你在手机端下载安装了TeamViewerAPP后&#xff0c;需要你先登录个人账号&#xff0c;然后还会要求你验证账户&#xff0c;同时跳转到一个网址中&#xff0c;但是这个网址并没有自动跳转到验证账户的位置。 解决办法&#xff1a; 在手机浏览器中进入下面这个网址&#xff1a;…

鸿蒙语言基础类库:【@system.vibrator (振动)】

振动 说明&#xff1a; 本模块首批接口从API version 4开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。从API Version 8开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.vibrator]。该功能使用需要对应硬件支持&#xff0c;仅支持…

VMware虚拟机无法访问互联网

一、什么情况下需要访问互联网 在某些情况下&#xff0c;VMware虚拟机需要通过访问互联网去获取外部资源&#xff0c;例如进行yum安装或者wget拉取操作等等。 二、处理方法 2.1.检查虚拟机网络模式和服务状态 虚拟机的网络模式需要使用 NAT 模式。 VMware NAT Service服务…

Delphi 11.2 配置Android SDK 环境

打开 Delphi 11 点击 Tools–Options… 然后点击 Deployment–SDK Manager–Add… 这里如果配置64位就选 Android 64-bit&#xff0c;如果配置32位就选 Android 32-bit 点击 Select an SDK version–Add New… 有警告图标的就是有问题的项&#xff0c;需要手动更新一下&#xf…

微信小程序开发:项目程序代码构成

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

PostgreSQL创建表和自增序列

一、创建表&#xff1a; 注意&#xff1a; 1、在mysql没有序列的概念&#xff0c;id自增通过auto_increment实现&#xff1b; 2、pgsql没有auto_increment的概念&#xff0c;如何实现id自增&#xff1f;有两种方式&#xff1a; 方式一&#xff1a;创建序列&#xff0c;绑定…

Android lmkd机制详解

目录 一、lmkd介绍 二、lmkd实现原理 2.1 工作原理图 2.2 初始化 2.3 oom_adj获取 2.4 监听psi事件及处理 2.5 进程选取与查杀 2.5.1 进程选取 2.5.2 进程查杀 三、关键系统属性 四、核心数据结构 五、代码时序 一、lmkd介绍 Android lmkd采用epoll方式监听linux内…

SpringBoot连接PostgreSQL+MybatisPlus入门案例

项目结构 一、Java代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…