索引和事务

news2025/9/12 3:51:14

文章目录

1.索引的含义以及应用

2.索引的查看、创建

3.带主键的索引底层结构

4.事务的含义

5.事务的特性

6.JDBC



一.索引的含义及应用

1.索引我们可以认为是文章的目录,有了它,我们可以更加快速的 查看到我们想要查找的内容。

2.并不是说我们加了索引,就一定会是查找的速度变快,例如数据存在大量重复的情况或者数据量特别少的情况。

3.索引会使查找数据的速度变快,但会是增删改数据的速度变慢,因为进行增删改就需要对索引进行调整(目录),索引还提高了空间的开销,构建索引,需要额外的空间来保存,但总体上加上索引会使进行增删改查的速度变快,因为增删改查大部分时间都是在查找操作。

4.索引创建好以后,不需要我们手动使用,直接查询的时候会走索引,实际上具体这一次操作走不走索引,数据库的执行引擎会自动评估,到底走不走索引,我们也可以用expalin这个关键字,来显示查询过程中索引的具体使用情况。

二.索引的查看、创建的删除

1.索引的查看:

show index from 表名


 

主键会自带一个索引

2.索引的创建:

create index  索引名 on 表名(列名)

3.索引的删除:

drop  index  索引名 on 表名

三.索引的底层结构:

首先大家可以考虑一下索引的底层会不会是哈希表呢?答案是否定的,因为我们哈希表只能比较相等。

那会不会是二叉搜索树呢?其实也不是的,因为当元素个数多的时候,树的高度也就会比较高,树的高度也决定了查询时候元素的比较次数会多,数据库进行比较时,是会读硬盘的。

那B树是不是呢?

我们看到一个节点上的数值多了,这样读写硬盘的次数就减少了,因为每个结点都是在硬盘上的。

实际上索引的底层结构也不是它

实际上对于带有主键的表,索引的底层是B+树 

叶子结点会用一种了类似于链表的方式连接起来,叶子结点包含了所有结点的值。

这种结构的好处:1.树的高度变低,硬盘IO的次数就会减少 

2.更适合范围查询,直接在叶子结点找到数据范围最小值和最大值就可以了

3.比较次数比较均匀,按照图来看,数据基本上都在3次多

4因为叶子结点包含所有的key,会包含所有的数据,而非叶子节点,只会保留一条数据id,这样非叶子结点我们可以把它放在内存里就可以了,进一步降低了硬盘IO。

事务

含义:将多个SQL打包到一起,作为一个整体执行,要么操作就全部执行,要么一旦出现异常,就都会回到原来的样子。数据库会把执行的每个操作记录下来,如果某个操作出错,就恢复到原来的样子,比如删除 会恢复到插入,修改会恢复到原来的样子,这个过程叫做‘’回滚‘’。

举个例子:我们转账的时候,我们给别人转账了50,自己的钱包会少50,而别人的钱包却没增加50,这时候会恢复到原来没转钱的状态。

事务的特性:

1.原子性。是指将多个SQL打包一同执行。

2.稳定性,事务产生的修改会保留下来会写入硬盘,不会因为突发情况而丢失,比如断电。

3.一致性,事务执行前后数据的要合法,比如像刚才的转账出现的状况就是不合法的

4.隔离性:指事务之间的影响程度。

JDBC

JDBC为多种关系数据库提供了统一的访问方式,为java开发人员操作数据库提供了统一的访问方式。

应用JDBC通常分为四个步骤:

1.建立数据库连接

2.创建操作命令

3.执行SQL语句

4.处理结果集

5.释放资源

增删改 的操作大体一样,只需换一下SQL语句

 public static void main(String[] args) throws SQLException {
        //1.先去创建DataSource 数据源,描述了mysql数据库在哪
        MysqlDataSource datasource=new MysqlDataSource();
        ((MysqlDataSource)datasource).setURL("jdbc:mysql://127.0.0.1:3306/java_114?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)datasource).setUser("root");
        ((MysqlDataSource)datasource).setPassword("1291691906");
        //2.和数据库建立连接
        Connection connection=datasource.getConnection();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入id");
        int id=scanner.nextInt();
        System.out.println("请输入name");
        String name=scanner.next();
        //3.构造SQL语句
        String sql="insert into student values(?,?)";
        //4.创建操作命令Statement对象,使用操作命令来执行SQL,将SQL语句发送到数据库里在这里对SQL语句进行词性语法的分析,SQL语句会预编译

        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        int ret=statement.executeUpdate();//executeUpdate()返回一个整数值,ret表示此次SQL语句操作影响了多少行。
        System.out.println(ret);
        System.out.println("sql:"+statement);
        //5.断开连接,释放资源,先创立的后释放。
        statement.close();
        connection.close();







    }
public static void main(String[] args) throws SQLException {
        DataSource datasource=new MysqlDataSource();
        ((MysqlDataSource)datasource).setURL("jdbc:mysql://127.0.0.1:3306/java_114?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)datasource).setUser("root");
        ((MysqlDataSource)datasource).setPassword("1291691906");
        Scanner scanner=new Scanner(System.in);

        System.out.println("请输入id");
        int id=scanner.nextInt();

        System.out.println("请输入name");
        String name=scanner.next();
        Connection connection=datasource.getConnection();
        String sql="update student set id=? where name=?";
        PreparedStatement statement=connection.prepareStatement(sql);

        statement.setInt(1,id);
        statement.setString(2,name);


        //statement.setString(2,name);
        int ret=statement.executeUpdate();
        System.out.println(ret);
        System.out.println(statement);
        statement.close();
        connection.close();

    }
ublic static void main(String[] args) throws SQLException {
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java_114?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("1291691906");
        Connection connection=dataSource.getConnection();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入id");
        int id=scanner.nextInt();
        System.out.println("请输入姓名");
        String name=scanner.next();
        String sql="delete from student where id=? or name=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        int ret=statement.executeUpdate();
        System.out.println(ret);
        System.out.println("sql:"+statement);
        statement.close();
        connection.close();







    }

查找:

public static void main(String[] args) throws SQLException {
        1.先去创建DataSource 数据源,描述了mysql数据库在哪
        DataSource datasource=new MysqlDataSource();
        ((MysqlDataSource)datasource).setURL("jdbc:mysql://127.0.0.1:3306/java_114?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)datasource).setUser("root");
        ((MysqlDataSource)datasource).setPassword("1291691906");
        //2.和数据库建立连接
        Connection connection=datasource.getConnection();
         //3.构造SQL语句
        String sql="select*from student";
        //4.创建操作命令Statement对象,使用操作命令来执行SQL,将SQL语句发送到数据库里,对SQL语句进行词性语法的分析。
        PreparedStatement statement=connection.prepareStatement(sql);
        //5.ResultSet对象被称为结果集,代表符合所有SQL语句条件的数据,并且可以通过getxx方法访问每一行的数据
        ResultSet resultSet=statement.executeQuery();//返回单个结果集
        while(resultSet.next())//将数据一行一行的往下遍历。
        {
            int id=resultSet.getInt("id");//获取当前行的id的值
            String name=resultSet.getString("name");//获取当前行name的值
            System.out.println("id:"+id+" "+"name:"+name);
        }
        //释放资源。先创立的后释放
        resultSet.close();
        statement.close();
        connection.close();

    }

ResultSet是一个结果集,它里面的数据一行一行排列,每行有多个字段,并且有一个记录指针,依次往下遍历指针所指的数据叫做当前数据行,如果想要获取某一行,使用Reslut对象里的next()方法,想要获取ResultSet对象里的所有行,可以用whlie循环 

 

 

Connection接口实现类由数据库提供获取Connection对象通常有两种方式:1.DriverManner(驱动管理类)的静态方法获取2.通过DataSource(数据源)对象获取,实际中我们采用DataSource对象。

这两种方式的区别1.DriverManger类获取的Connection连接,是无法重复利用的,每次使用完释放资源后,通过Connection.close()关闭物理连接。

2.DataSource提供连接池的支持,连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接时,释放资源调用connection.close()将Connection对象回收。

Statement对象,将SQL语句发送到数据库里,JDBC API主要提供了三种Statement对象

1.Statement

用于执行不带参数的简单的SQL语句

2.PreparedStatement

用于执行带或者不带参数的SQL语句

SQL语句会预编译在数据库系统

CallableStatement

用于执行数据库存储过程的调用。实际开发中,我们常用PreparedStatement对象。

PreparedStatement对象:两种执行SQL的方法

1.executeQuery()方法执行后返回单个结果集,通常用于select语句

2.executeUpdate()方法返回一个整数,表示受影响的行数,通常用于update、insert、delete语句

 

 

 

 

 

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

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

相关文章

一周侃 | 周末随笔及推荐

前言 每周一次的闲聊胡侃又来啦!这一周世界发生了许多大事,从举世瞩目的中美元首会晤到新的防疫政策二十条出来之后各地防疫政策的转变,再到俄乌冲突持续进行,联大通过俄罗斯赔偿计划……百年未有之大变局正加速演进,…

【k8s】8、service详解

文章目录一、Service详解1、Service介绍1.1 userspace模式1.2 iptables 模式1.3 ipvs模式2、Service类型3、Service使用3.1 实现环境准备3.2 Cluster类型的Service3.2.1 cluster类型的生成ip3.2.2 cluster类型不生成ip3.3 NodePort类型的service3.4 LoadBalancer类型的Service3…

【MySQL】MySQL体系结构与内部组件工作原理解析(原理篇)(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

GEE两行代码下载任意范围影像python API

GEE三行代码下载任意范围影像 前不久,吴秋生博士更新了geemap,现在能更方便地下载影像了最新的下载再也不受有限的Google Drive、图像过大会自动分割、缓慢的下载速度影响了。 有兴趣的同学可以see this: https://geemap.org/notebooks/118_download_i…

蓝牙传输 LE Audio技术

蓝牙 蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,利用"蓝牙"技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网Internet之间的通信&…

react(受控组件、生命周期、使用脚手架)

目录 使用脚手架 其他: 学习js: mdn 文档 MDN Web Docs 在react官方文档的 CDN 链接里下载最新的react版本react官网:React 官方中文文档 – 用于构建用户界面的 JavaScript 库 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1. 受控组件…

ES6 入门教程 15 Proxy 15.3 Proxy.revocable() 15.4 this 问题 15.5 实例:Web 服务的客户端

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程15 Proxy15.3 Proxy.revocable()15.4 this 问题15.5 实例:Web 服务的客户端15 Proxy 15.3 Proxy.revocable() …

BLDC的列子2

1.三相采样电流的采集以u相为举例。 采集下桥臂I-V的电压。在除以采样电阻。就可以得到采样电流。但由于I-V的电压比较小。 需要一个放大电路把电压放大ADC才采集的到。 放大后的电压是AMP_IU.用ADC去采集这个电压。从而算出I_V的电压。 在电机停止的时候也会有微小的电压。…

Azure 深入浅出[2] --- App Service的部署并查看应用Log

假设读者已经申请了Azure的免费订阅的账户。如果想部署一个前端NodeJS的服务到Azure的App Service应该如何部署并查看应用程序本身的日志呢?笔者在这边文章就带大家快速看一下。 1.环境准备 安装Visual Studio Code以及在Visual Studio Code里面安装Azure App Ser…

文件上传漏洞 | iwebsec

文章目录靶场搭建文件上传漏洞前端JS过滤绕过文件名过滤绕过Content-Type过滤绕过文件头过滤绕过.htaccess文件上传文件截断上传条件竞争文件上传靶场搭建 参考文章https://juejin.cn/post/7068931744547733517出现个小问题,我的端口冲突了,所以换了一个…

Linux-unbuntu修改apt源

本文介绍如何将ubuntu的apt源修改为清华大学的镜像源 主要是修改/etc/apt/source.list的文件,并且使用sudo apt-get update来刷新源 修改apt源 unbuntu安装好之后,apt的源是us的,这样下载速度比较慢 apt源的地址放在/etc/apt/source.list中…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.14 ES 索引操作

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.14 ES 索引操作4.14.1 索引操作4.14.2 小结4 数据…

m基于OFDM数字电视地面广播系统中频域同步技术研究

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 OFDM技术的基本构架如下所示: 注意系统中的虚线部分就是你要做的OFDM的频域同步模块。我们的MATLAB代码就是参考这个系统结构进行设计的。其中虚线就是本课题要做的代码部分…

[附源码]java毕业设计停车场管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

day04 spring 声明式事务

day04 spring 声明式事务 1.JDBCTemplate 1.1 简介 为了在特定领域帮助我们简化代码,Spring 封装了很多 『Template』形式的模板类。例如:RedisTemplate、RestTemplate 等等,包括我们今天要学习的 JDBCTemplate。 1.2 准备工作 1.2.1 加…

Python之TCP网络编程

目录 1. python3编码转换 2. TCP网络应用程序开发 2.1 概述 2.2 开发流程 2.3 TCP客户端程序开发 2.4 TCP服务端程序开发 2.5 注意点 3. socket之send和recv原理 4. 案例 1. python3编码转换 1.网络传输是以二进制数据进行传输的。 2.数据转化用到了encode和decode函数…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.1 get()

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.1 get()15 Proxy 15.2 Proxy 实例的方法 拦截方法的详细介绍。 15.2.1 get() get方…

应急响应-进程排查

进程排查 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。无论在Windows还是Linux中,主机在感染恶意程序后,恶意程序都会启动相应进程来完成恶意操作。 Window…

Android 深入理解View.post() 、Window加载View原理

文章目录背景:如何在onCreate()中获取View的宽高?View.post()原理Window加载View流程setContentView()ActivityThread#handleResumeActivity()总结扩展Window、Activity及View三者之间的关系是否可以在子线程中更新UI资料背景:如何在onCreate…

m认知无线电信号检测算法matlab仿真,能量检测,循环平稳检测以及自相关检测

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 频谱感测是认知无线电的一项关键技术。我们将频谱感知作为一个分类问题,提出一种基于深度学习分类的感知方法。我们归一化接收信号功率以克服噪声功率不确定性的影响。我们使…