mysql一些事

一.联合查询/多表查询

联合查询关键在于笛卡尔积的过程

笛卡尔坐标积的排列组合

首先它会将两个表用排列组合的方式进行排列组合。

表一

表二

进行排列组合

我们发现它的行是 两个表的行相乘,列是两表的列相加。

我们所看到的数据有合理的也有不合理的我们接下来要做的就是将这些不合法的数据剔除,另外这种方法十分不安全,因为数据量太过庞大了,就行相乘来说就足以让服务器崩溃。

筛选

我们得找两个表的相同项比如id这一项

这下数据就是有效的了,都是有效信息。美化一下

这种方法虽然方便但可读性差,还不安全。

在两个表之间有关联的情况下合成的表为内连接反之为外连接

内连接

外连接

 左连接

右连接

自连接

二.联合查询

这个方法可以将两个完全不同的表合并在一起,会自动去重,如果不想去重则须在union后加上all

 三.索引

索引能够提高查询速度,但是会占用更多的空间来生成索引,但是可能会降低插入修改删除的速度,

1.查看索引     show index from 表名

2.创建索引     create index 索引名字 on 表名(列名)

3.删除索引      drop index 索引名 on 表名

另外主键和外键会自动生成索引,而删除索引这个操作对于自动生成的无效。

在创建索引时是一个危险操作,因为它会对现有的数据进行一次大规模的整理,如果表很大的胡,会导致服务器收到的请求量剧增。

所以我们会再搞另一个机器来部署mysql服务器,创建同样的表,并加上索引,然后将需要的表的数据导入这个表中。

索引背后的一些事情

索引是一个改进的树形结构,B+树(N叉搜索树)

B树

1.每个结点的度都是不一样的

2.一个结点保存N个key就划分N+1个区间

3.虽然一个节点可以保存N个key,但是达到一定的规模会触发节点的分裂,删除元素达到一定规模则会触发节点的合并

如果用B树来查询一个树可能就会很麻烦,因为会涉及到这颗树找不到就要返回到上一棵树来找,可能还不能找到,十分麻烦。

B+树

1.B+树也是一个N叉搜索树,一个节点上存在N个Key,划分N个区间

2.每个节点上N个key中,最后一个就是子树的最大值

3.父节点上的每个key都会以最大值的身份再子节点的对应区间中存在
所以我们看到在叶子节点上包含着树的所有元素

4.B+树会使用链表这样的结构,把叶子节点串起来

 B树与B+树的比较

对于B树来说查询速度往往是不稳定的,因为如果查询的元素层数高的话就很快,反之,对于B+树来说最终都会在叶子节点来进行查询整体时间差距不大,是稳定的。

B+树的优点

1.N叉搜索树,树的高度受限,降低IO次数

2.非常擅长范围查询

3.所有查询最终都是要落到叶子节点上,查询与查询之间的花销都是稳定的。

4.由于叶子节点是全集,会把数据只存储在叶子节点上,非叶子节点只是存储一个用来排序的key,这样使得非叶子节点并不会占用多少空间,叶子节点会非常占用空间,将非叶子节点缓存在内存中,整体的查询速度又减少了。

四.事务

在转账过程中如果A转账给B而A的余额减少了,但发生了一些不可避免的意外,使得A的钱扣了,但B的钱却没有增加,这就是个很严重的错误。

而事务可以避免上面问题,且听我说

1.事务就可以把多个sql打包成一个整体

2.可以保证这些sql要么全部执行,要么一个都没执行成功。

我们将把多个sql打包在一起作为一个整体来执行,成为“原子性”。

有这么一个过程就是

开启事务

执行sql

结束事务

主动触发回滚

回滚

它通过日志的方式,记录事务中的关键操作,这样记录的数据就是回滚的依据(一旦发生重启等操作,就会发现回滚日志有一些需要进行回滚的操作,于是就可以完成这里的回滚)。

事务的一些其他特性

1.原子性

回滚的方式,保证这一系列操作,都能执行正确,或者恢复如初

2.一致性

事务执行之前和之后数据都不能太离谱

3.持久性

事务做出的修改都是在硬盘上持久保存的,重启服务器,数据仍然存在,事务执行的修改依旧是有效的

4.隔离性

数据库并发执行多个事务的时候,涉及到的问题

数据库并发执行

mysql是一个客户端服务器结构的程序

一个服务器可以为多个客户端提供服务

多个客户端都会让数据库执行事务。

我们希望数据库服务器执行效率高,就希望提高并发程度,但是提高了并发程度后一些问题就会显现出来。

隔离级别就是在“数据正确”和“效率”之间做权衡

往往提升了效率,就会牺牲正确性,提升了正确性就会牺牲效率

问题的展现

1.脏读问题

假设A是一个写数据的事务,B是一个读数据的事务,当A出现的修改数据的情况机会使得B读取的数据有误,这些数据是无效数据(脏数据)。

这俩事务一个接一个串的执行,没事,但并发执行就容易出现脏读。

我们可以加一个约定或者说是锁,A写数据的时候,B不能读,但是这种方法使得并发性降低了,隔离性提高了,效率降低了,数据准确性提高了。

2.不可重复读

还是那个假设,这次A写完了,轮到B来读了,但在B读的过程中,A又觉得可以优化,就进行了修改,这使得B又读到东西又突然变了,这又是无效数据,这次涨记性了,我们又加一个约束,A写了之后就不能改了,加上前面的约束,使得并发性又进一步降低了,隔离性提高了,效率降低了,数据的准确性提高了。

如果两个事务之间的影响越大,隔离性就越低,反之。

3.幻读

还是那个假设,这次A在写,B闲下来了,B想着总得做点啥吧,所以它也开始写了,在最后读的时候把结果集一对发现问题了,这称为幻读。

这些问题因为并发而存在,所以我们要想去避免这些问题最好的办法就是不去并发,即使串行化,这与我们的初衷相违背了,虽然数据是最为准确的,但并发程度最低,隔离性最高,效率最低。

读未提交并发程度最高, 速度最快, 隔离性最低,准确性最低

脏读

读已提交引入了写加锁,只能读写完之后提交的版本并发程度降低了,速度降低了:隔离性提高了,准确性提高了
不可重复读

可重复读引入了写加锁和读加锁. 写的时候不能读,读的时候也不能写并发程度又进一步降低了,速度降低了;隔离性提高了,准确性提高了
幻读
串行化严格的按照 串行 的方式,一个一个的执行事务.并发程度最低(没有并发),速度最低:隔离性最高,准确性最高。

五.数据库编程(java)(JDBC)

数据库编程,需要数据库服务器,提供一些API(Application Programming Interface)应用程序编程接口,提供给一组类/函数进行调用来完成一些功能。

在导入了jar之后我们就可以开始操作了。

1.先创建DataSoure

URL是网络上资源的位置,给jdbc操作mysql用的,我们在这里进行了向下调整,mysqldatabase这个类名不去扩散到其他地方,降低耦合性。

需要注意的是127.0.0.1是一个环回IP,一般是jdbc和mysql在同一个主机上使用环回IP就可以。

在设置了用户名与密码之后我们就要建立于服务器之间的连接

2.建立数据库于服务器之间的连接

我们得提前抛出一个异常才不会爆红

3.构造一个sql

我们构造了sql语句后会进行解析检查,减轻服务器的负担。 

4.把sql发送给服务器,返回值是一个整数表示影响到的整数

只针对于增删改,查有另一套

 

5.释放资源,关闭连接

 

我们用jdbc操作服务器成功了 

当然还可以执行其他语句 

 

或者自己输入 我们来看看查询这方面

  public static void main(String[] args) throws SQLException {//1.创建DataSoureDataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("1793334060qq.");//2.建立连接Connection connection =  dataSource.getConnection();//3.构造sqlString sql = "select * from student where id = ?";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,100);//4.执行 sql// ResultSet 表示查询的结果集合ResultSet resultSet = statement.executeQuery();//5.遍历结果集合//通过next方法就可以获得临时表中的每一行数据,如果获取到最后一行之后,再执行next 返回false,循环结束while(resultSet.next()){//针对这一行进行处理//取出列的数据int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = " + id + ",name = " + name);}//6.释放资源resultSet.close();statement.close();connection.close();}

 最大的不同在于ResuSet,resultset光标的指向不是有效数据所以要看next()。

自增id

B+树

 

对于B+树来说,我们在查找到大于40小于50的数,我们就会来到42和55这两列,把这两列加载到内存中,然后按照顺序应该是找到了42,44,当我们想插入43,也是一样,我们会找找到我们要插入的位置,但当我们接下来要插入45时,如果说是id自增,则会在当前的列查找并插入,但如果不是自增,跑到了89这一列,我们就要先将原来的缓存置换出去,在缓存中加载89这一列,然后加载到磁盘,没找到位置就又去缓存置换找到42这一列,这一列显然这是浪费时间的。 

全表遍历

比如对于1000条数据进行遍历,默认按照id自增遍历的话,我们就可以进行分条遍历,因为id时自增,则只需要考虑边界条件即可,以100个数据为一条进行遍历。

缺点

可预测性,id自增以为这别人可以轻易知道你的数据总数。

可能用尽,id时整形总有用完的一天。

分库分表困难,如果两个库都用自增id,id就重复了。

 

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

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

相关文章

【工具】Open WebUI:本地化部署的AI交互平台

文章目录 一、Open WebUI 简介二、核心功能详解1. 多模型与多模态支持2. 本地RAG与文档集成3. 开发与定制化能力4. 安全与权限管理5. 用户体验优化 三、安装与部署指南1. 快速安装方式2. 高级配置3. 常见问题 四、实际应用场景1. 个人隐私助手2. 企业知识库3. 学术研究4. 创意工…

AutoGPT

一、简介 是一个基于openAI研发的GPT4模型的一个开源应用程序,根据用户指定的目标,自动生成所需的提示,并且执行需要多个步骤才能完成的项目,整个过程不需要人类干预和指导(无监督学习),生成式…

[C++] 小游戏 决战苍穹

大家好,各位看到这个标题,斗破苍穹什么时候改叫决战苍穹了?其实,因为版权等一系列问题,斗破苍穹正式改名为决战苍穹,这个版本主要更新内容为解决了皇冠竞技场太过影响游戏平衡,并且提高了一些装…

Spring的数据库编程

本内容采用最新SpringBoot3框架版本,视频观看地址:B站视频播放 1. JdbcTemplate概述 针对数据库操作,Spring框架提供了JdbcTemplate类,JdbcTemplate是一个模板类,Spring JDBC中的更高层次的抽象类均在JdbcTemplate模板类的基础上创建。 JdbcTemplate类提供了操作数据库…

Debezium MySqlValueConverters详解

Debezium MySqlValueConverters详解 1. 类的作用与功能 1.1 核心作用 MySqlValueConverters是Debezium中负责MySQL数据类型转换的核心类,主要功能包括: 数据类型映射:将MySQL的数据类型映射到Kafka Connect的Schema类型值转换:将MySQL的原始值转换为Kafka Connect可用的…

进程与线程:06 操作系统之“树”

操作系统核心知识回顾与思维训练 在之前的学习中,我们深入探讨了CPU管理相关内容。 CPU管理内容回顾:我们学习了CPU直观管理方法,了解如何让简单程序执行,分析了CPU效率低下的原因及处理办法,即实现多程序执行。接着…

Android Studio Profiler

1.我们想要查看自己方法的调用链,或者分析方法耗时的情况,可以选择Android Studio的Profiler,比较方便快捷。如下: 2.基本的面板参数讲解: 3.可以通过搜索,查看对应的方法,以及方法的调用链…

33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?

在Visual Studio(VS)中遇到提示“以下文件中的行尾不一致。是否将行尾标准化?”时,意味着当前打开或正在编辑的文件内部存在行尾符(EOL,End-Of-Line)格式不统一的情况。以下是详细解释和应对建议…

头歌实验 库、表、数据的创建管理与备份迁移

第1关:创建db_ebank数据库 drop database IF EXISTS db_ebank;/********** Begin **********/ create database db_ebank; /********** End **********/show databases; 第2关:创建数据表并设置约束 1.任务要求 在 db_ebank 数据库中创建相应8个数据…

同城跑腿小程序帮取帮送接单抢单预约取件智能派单同城配送全开源运营版源码优创

一、源码描述 这是一套同城跑腿小程序,基于FastadminUniapp框架,全开源无加密,可私有化部署,包含用户端、骑手端和运营端(后端),支持帮取/帮送模式,支持一键接单/抢单,主…

利用无事务方式插入数据库解决并发插入问题

一、背景 由于项目中同一个网元,可能会被多个不同用户操作,而且操作大部分都是以异步子任务形式进行执行,这样就会带来并发写数据问题,本文通过利用无事务方式插入数据库解决并发插入问题,算是解决问题的一种思路&…

Nuxt3还能用吗?

Nuxt3还能用吗? 前一段时间,我完成了整个产品,从Nuxt到Next的迁移,因为面临了一些在框架层面就无法解决的问题。 payload json化 在所有的的Nuxt中,我们都能看到有这样一个东西。 其实有这个东西也很正常&#xff0…

Dify 获取天气数据并以echarts图表显示

Dify 获取天气数据并以echarts图表显示 1. 创建一个 Chatflow2. 创建一个 HTTP 请求节点3. 创建一个代码执行节点4. 创建一个直接回复节点5. 发布并预览 1. 创建一个 Chatflow 2. 创建一个 HTTP 请求节点 请求地址:https://weather.cma.cn/api/climate?stationid5…

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 02.OpenGL图像管线

1. OpenGL图像管线 OpenGL(Open Graphics Library)是一个跨平台的、功能强大的图形渲染API,用于开发2D和3D图形应用程序。它由Khronos Group维护,广泛应用于游戏开发、图形设计、虚拟现实等领域。 1.0.1. OpenGL的特点&#xff…

Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62

Linux_基础篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.01 适用环境: Centos7 文档说明 本文…

算法基础学习|03二分

一、思路 (1)mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 (2)mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何选择模…

18. LangChain分布式任务调度:大规模应用的性能优化

引言:从单机到万级并发的进化 2025年某全球客服系统通过LangChain分布式改造,成功应对黑五期间每秒12,000次的咨询请求。本文将基于LangChain的分布式架构,详解如何实现AI任务的自动扩缩容与智能调度。 一、分布式系统核心指标 1.1 性能基准…

Java泛型(补档)

核心概念 Java 泛型是 Java SE 1.5 引入的一项重要特性,它的核心思想是 参数化类型(Parameterized Types),即通过将数据类型作为参数传递给类、接口或方法,使代码能够灵活地处理多种类型,同时保证类型安全性…

LeetCode 热题 100:普通数组

53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输…

【kafka系列】消费者组

目录 消费者组功能点 1. 动态负载均衡 2. 容错高可用 3. 消费进度管理 4. 并行消费能力 5. 消费隔离性 其他要点 1. Rebalance过程详解 2. 位移提交的精确语义 3. 消费者限速策略 4. 跨机房消费设计 消费者组功能点 1. 动态负载均衡 核心机制:通过Rebal…