什么是事务?什么是索引?什么是视图?

news2024/12/26 11:46:21

目录

一、事务

二、视图

1 、视图概念

2、为什么要使用视图

3 、性能问题

4 、定义视图

5、查看视图

6、删除视图

三、索引

1、引入索引的问题

2、索引是什么

3、索引为什么选择b+树


一、事务

事务是什么?

        事务是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

        事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。

为什么需要事务?

        例如 :银行转账的问题,从一个账号扣款并使另一个账号入账,这两个操作要么都执行,要么都不执行。所以,应该把它们看出一个事务。

事务的四大特性ACID:(记住)

  • 原子性(atomicity)   
    • 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
  • 一致性(consistency)
    • 数据库总是从一个一致性的状态转换到另外一个一致性的状态。
  • 隔离性(isolation)
    • 通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的
  • 持久性(durability)   
    • 一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。持久性是个有点模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且不可能有能做到100%的持久性保证的策略

隔离级别
        在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。
        每种存储引擎实现的隔离级别不尽相同。如果熟悉其他的数据库产品,可能会发现某些特性和你期望的会有些不一样(但本节不打算讨论更详细的内容)。读者可以根据所选择的存储引擎,查阅相关的手册。

查看当前会话隔离级别:

SELECT @@SESSION.transaction_isolation;

查看系统隔离级别: 

SELECT @@GLOBAL.transaction_isolation;

四种隔离级别

  • READ UNCOMITTED(未提交读)
    • 在 READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。
    • 事务可以读取未提交的数据,这也被称为脏读〈Dirty Read)。(也就是在A事务内插入某行数据,B事务在插入后查询语句会显示出A插入的信息)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。
  • READ COMMITTED(提交读)
    • 大多数数据库系统的默认隔离级别都是READ COMMITTED(但 MySQL不是)
    • READCOMMITTED满足前面提到的隔离性的简单定义:一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。(也就是在A事务内插入某行数据,B事务在A事务提交commit之后会显示出A插入的信息)。这个级别有时候也叫做不可重复读(nonrepeatableread),因为两次执行同样的查询,可能会得到不一样的结果。
  • REPEATABLE READ(可重复读)
    • REPEATABLE READ解决了脏读的问题。
    • 该级别保证了在同一个事务中多次读取同样记录的结果是一致的
    • 但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。(也就是在A事务内插入某行数据,B事务在插入时查询语句和插入后查询语句是一样的,不会显示出A插入的信息,直到B事务关闭又重新读取才能读取到)。
    • 可重复读是MySQL的默认事务隔离级别
  • SERIALIZABLE(可串行化)
    • SERIALIZABLE是最高的隔离级别
    • 它通过强制事务串行执行,避免了前面说的幻读的问题。
    • 简单来说,SERIALIZABLE 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。(也就是AB事务不允许同时执行)。

设置隔离级别 

# 设置全局隔离级别
set global transaction isolation level REPEATABLE READ;
set global transaction isolation level READ COMMITTED;
set global transaction isolation level READ UNCOMMITTED;
set global transaction isolation level SERIALIZABLE;
#设置会话隔离级别
set session transaction isolation level REPEATABLE READ;
set session transaction isolation level READ COMMITTED;
set session transaction isolation level READ UNCOMMITTED;
set session transaction isolation level SERIALIZABLE;

开始事务,命令如下:

开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中

begin; 
#或者
start transaction; 

提交事务,命令如下 将缓存中的数据变更维护到物理表中

commit;

回滚事务,命令如下:

rollback;

 回滚撤回从"begin"开始的所有处理

二、视图

1 、视图概念

        视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库 中实际存放数据,它的数据来自定义视图时使用的基本表,并且是在使用视图时动态生成的。

2、为什么要使用视图

  1. 简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。
  2. 重复使用该sql语句。
  3. 使用表的组成部分而不是整个表。
  4. 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表。
  5. 更改数据格式和表示。

3 、性能问题

        因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果是多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会出现性能下降。

4 、定义视图

        定义视图建议以"_v"开头

        create view 视图名 as select语句;

5、查看视图

show tables; 默认会显示表和视图,但不能区分。

show full tables; 会显示表和视图的类型

6、删除视图

drop view viewname

三、索引

1、引入索引的问题

        在图书馆查找一本书的过程。 在一般的软件系统中,对数据库的操作还是以查询为主,当数据量较大时,优化查询是关键。

        那么可以给所有的列都加上索引嘛?(面试题)
        其实不可以的,因为每添加一个索引就需要重新添加一颗b+树,如果所有的列都添加索引会导致插入和查询的成本变高,因此只需要在经常使用的列添加索引就是最好的。

2、索引是什么

        索引是一种特殊的文件,它包含着对数据表里所有记录的引用指针。简单讲,就像一本书前面的目录, 能加快查询速度

        索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。
        索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降。
        索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能要好两个数量级。创建一个真正“最优”的索引经常需要重写查询。

  • 索引是帮助mysql高效获取数据的数据结构
  • 索引存储在文件系统中
  • 索引的文件存储形式与存储引擎有关
  • 索引文件的结构

3、索引为什么选择b+树

        可以考虑作为索引的数据结构有如下几种:

  • hash表
  • 二叉树
  • b树
  • b+树(innoDB存储引擎上)使用b+树是因为b+树的高度稳定

        使用hash表的缺点:

  • hash存储需要将所有的数据文件添加到内存,浪费空间
  • 如果是等值查询,hash很快,但实际工作中范围查找更多,而不是等值查询,所以hash就不合适了

测试索引

1)在mysql中创建数据库 test_indexdb,操作如下:

create database test_indexdb;

2)在test_indexdb中创建表 test_index,操作如下:

use test_indexdb;

create table test_index(title varchar(20));

3)运行程序向表中插入1万条数据,都是字符串, c程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
    MYSQL mysql_conn;//连接数据库句柄
    MYSQL * mysql = mysql_init(&mysql_conn);//初始化句柄mysql_conn
    if ( mysql == NULL )
    {
        printf("init err\n");
        exit(1);
    }
    //连接数据库                                                              
 mysql=mysql_real_connect(mysql,"localhost","root","Abc_111111","test_indexdb",3306,NUL
L,0);//连接本机localhost,用户为root,密码Abc_111111,数据库test_indexdb,端口3306
    if ( mysql == NULL )
    {
    printf("connect err\n");
    exit(1);
    }
    char sql_buff[128] = {0};
    for( int i = 0;i < 10000; i++ )
    {
        sprintf(sql_buff,"insert into test_index values('test-%d')",i);//待处理的执行语句存放入sql_buff内
        if ( mysql_query(mysql,sql_buff) != 0 )//执行sql语句mysql_query()
        {
            printf("insert into err:%s\n",mysql_error(mysql));//打印错误信息
            break;
        }
    }
    mysql_close(mysql);
}

4) 查询验证 开启运行时间监测:

set profiling=1;

查找一条数据 : test-9999

select * from test_index where title='test-9999';

查看执行的时间:

show profiles;

为表test_index的title列创建索引:

create index title_index on test_index(title(20));

执行查询语句后,再次查看执行时间

select * from t_index where title='test-9999';
show profiles;
mysql> show profiles;

删除索引

drop index t_index on test_index;

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

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

相关文章

Python+Selenium+Unittest 之selenium2--元素定位1-简介

这篇先说下webdriver的几种元素定位方式&#xff0c;让大家有个大概的了解&#xff0c;UI自动化说白了就是使用代码代替人工去进行操作&#xff0c;在页面上&#xff0c;执行人员可以直接对看到的任何地方进行点击、拖动等操作&#xff0c;而代码的话需要识别到到底要点那个按钮…

生产制造业ERP管理系统对于制造企业的好处有哪些?

任何一家企业在管理当中都存在或多或少的问题&#xff0c;这些问题对企业的发展都形成了一定的阻碍。在生产制造业当中&#xff0c;由于每日的繁重的生产计划和大量的生产作业&#xff0c;使得企业管理存在一些问题&#xff0c;这些问题不利于生产的有序进行&#xff0c;从而阻…

图表控件LightningChart.NET 系列教程(八):用代码创建图表

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

【微服务】分布式事务Seata

分布式事务Seata1.分布式事务问题1.1.本地事务1.2.分布式事务2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾2.2.BASE理论2.3.解决分布式事务的思路3.初识Seata3.1.Seata的架构3.2.部署TC服务3.3.微服务集成Seata3.3.1.引入依赖3.3.2.配置TC地址3.3.3…

商用清洁机器人:科沃斯“破圈”、高仙机器人“纵深”

配图来自Canva可画 正所谓科技改变生活&#xff0c;机器人在人们日常生活中出现的频率正在逐步提高。同时&#xff0c;随着智能技术的不断迭代升级、用户需求的增多&#xff0c;机器人的应用场景逐步拓宽、功能形态也愈发多样化&#xff0c;比如配送机器人、医疗机器人、教育机…

Android 12.0 启动app时设置密码锁

1.前言 1.1概述 在12.0的系统产品开发中,对于限制某些app的启动的功能中,在项目中的需求是在点击app启动的时候,根据包名设置密码锁,当输入正确的密码的时候来启动这个app,否则 就不能启动这个app,达到限制使用app的目的,这就需要在app启动的时候,检测app的包名,然后在…

分布式架构的必问理论

基础理论&#xff1a; CAP理论&#xff1a; CAP理论是分布式系统设计中最基础、也是最为关键的理论&#xff0c;它指出&#xff0c;分布式数据存储不可能同时满足以下三个条件。 一致性&#xff08;Consistency&#xff09;&#xff1a;每次读取要么获得最近写入的数据&…

OAuth2 (二)

目录 创建项目结构 父工程 客户 认证服务器 资源拥有者 资源服务器 创建项目结构 演示代码下载&#xff1a; https://gitee.com/lisenaq/oauth2-example.git 演示客户发请求&#xff1a; http://localhost:8080/client/getCode 父工程 父工程有:子模块需要重新导入该…

CVE-2022-34916 Apache Flume 远程代码执行漏洞分析

项目介绍 Apache Flume 是一个分布式的&#xff0c;可靠的&#xff0c;并且可用于高效地收集&#xff0c;汇总和移动大量日志数据的软件。它具有基于流数据流的简单而灵活的体系结构。它具有可调的可靠性机制以及许多故障转移和恢复机制&#xff0c;并且具有健壮性和容错性。它…

Spring/SpringBoot/SpringCloud面试题

SpringBoot和SpringMVC的区别 形式上&#xff1a;SpringBoot是一个自动化配置的工具&#xff1b;SpringMVC是一个web框架在搭建项目时&#xff1a;SpringMVC需要手动配置xml文件&#xff0c;同时需要配置Tomcat服务器。而SpringBoot采用约定大于配置的方式&#xff0c;进行自动…

【Linux系统】第五篇:Linux中编译器gcc/g++的使用

文章目录一、编译工具gcc/g二、程序编译的过程&#x1f384;预处理&#x1f384;编译&#x1f384;汇编&#x1f384;链接三、动态链接和静态链接&#x1f33b;动态链接&#x1f33b;静态链接&#x1f33b; 程序动、静态链接的区分一、编译工具gcc/g gcc/g 分别是 C/C 的编译器…

【wp】hgame2023 week3 RePwn

【wp】hgame2023 week3 Re&&Pwn Re cpp那个chacha20加密不会。 kunmusic 用dnspy逆dll&#xff0c;在Program的Main方法中找到了初始化的数据 下断点执行&#xff0c;拷贝出data 写一份脚本进行data与104的异或 def step_one():with open("./data", enc…

发明专利申请流程资料

​发明专利申请流程 依据专利法&#xff0c;发明专利申请的审批程序分为&#xff1a; 1、受理阶段 2、初步审查阶段 3、公布阶段 4、实质审查阶段 5、授权阶段 发明专利申请所需资料 1、发明专利请求书。 2、说明书。 3、权利要求书。 4、说明书摘要。 5、有附图的可同时提交说…

Actionchains在selenium中的使用方法

今天分享一下selenium最常用的ActionChains的使用&#xff0c;以及碰到的一些问题的解决。 1.selenium解决鼠标悬停的问题 今天抓取某个平台的数据时发现有的数据需要鼠标悬停在上面才能加载出来&#xff0c;于是就想到了使用ActionChains解决悬停的问题&#xff0c;下面是思…

计算机组成原理 | 第九章:控制单元的功能 | 微操作命令 | 时钟周期

文章目录&#x1f4da;微操作命令的分析&#x1f407;取指周期&#x1f407;间址周期&#x1f407;执行周期&#x1f955;非访存指令&#x1f955;访存指令⭐️&#x1f955;转移指令&#x1f407;中断周期&#x1f4da;控制单元的功能&#x1f407;控制单元的外特性&#x1f9…

分享微信报名小程序怎么做_瑜伽健身房培训报名小程序开发介绍

活动报名收费签到小程序&#xff0c;支持个人免费组织报名收款和现场签到。随时随地管理活动、发布活动、查看收入明细提现资金更效率。 活动报名收费签到小程序主要功能有&#xff1a; 在线报名&#xff1a;通过二维码或链接分享活动入口&#xff0c;亦可轻松放进入公众号。 …

客户端通过SSH连接Linux服务器超时问题解决方法汇总

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

Windows无法进入睡眠模式怎么办?

睡眠模式是电脑的一种低功耗模式&#xff0c;能减少耗电。当你要离开电脑一阵&#xff0c;但又不想关闭文档和程序&#xff0c;就可以选择让电脑暂时休眠。 如果你的电脑无法进入睡眠模式&#xff0c;可以尝试下面几种方法&#xff1a; 更换电源选项检查电源命令使用电源疑难…

开源机器学习软件对AI的发展意味着什么?

作者&#xff5c; Max Langenkamp OneFlow编译 翻译&#xff5c;徐佳渝、杨婷 为什么要关注机器学习开源软件&#xff08;MLOSS&#xff09;&#xff1f;在我们看来&#xff0c;MLOSS对AI发展来说举足轻重&#xff0c;但未获重视。 机器学习开源软件是开源许可下发布的专为机器…

“易”起涨知识|人人都在追捧的低代码开发,到底有什么优势?

低代码的根本价值在于&#xff1a;劳动力转移。运营、产品能 cover 部分开发工作&#xff0c;实现研发流左移&#xff0c;敏捷迭代。 劳动力转移只是表面&#xff0c;低代码价值还是归属于自动化了信息传递。 产品用文字和交互图&#xff08;PRD&#xff09;表达了一遍完整的产…