MySQL数据库的索引和事务

目录

一、索引

1.1Mysql索引

1.2索引的作用

1.3 创建索引的依据

1.4 普通索引

修改表方式创建索引

删除索引

1.5 唯一索引

修改表方式创建

删除索引

1.6 主键索引

修改表方式创建

1.7 组合索引

1.8 全文索引

1.9查看索引

二、事务

2.1事务概念

2.2事务的ACID特点

 2.3查询全局事务隔离级别

2.4设置事务的隔离级别

2.5使用 set 设置控制事务

自动提交关闭

 自动提交开启


一、索引

1.1Mysql索引

  • 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)
  • 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地然后访问相应的数据,因此能加快数据库的查询速度。
  • 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
  • 索引是表中一列或者若干列值排序的方法。
  • 建立索引的目的是加快对表中记录的查找或排序。

1.2索引的作用

优点

  • 设置了合适的索引之后,数据库利用各种快速定技术,能够大大加快查询速度,这是创建索引的最主要的原因。
  • 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
  • 可以降低数据库的I/O成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能

缺点

索引需要占用额外的磁盘空间。

对于MyISAM引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。 而InnoDB引擎的表数据文件本身就是索引文件。
 

1.3 创建索引的依据

索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

  • 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位。
  • 记录数超过300行的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁地字段不适合创建索引
  • 经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引
  • 在经常进行GROUP BY、ORDER BY的字段上建立索引
  • 索引应该建在选择性高的字段上。(即重复性低的字段)
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
     

1.4 普通索引

CREATE INDEX 索引名 ON 表名 (列名(length));

修改表方式创建索引

 ALTER TABLE 表名 ADD INDEX 索引名(列名);

删除索引

  1. ​drop index 索引名 on 表名; #直接删除索引

  2. ​alter table 表名 DROP index 索引名; #以修改表的方式删除索引

1.5 唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一。 唯一索引 允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

create unique index 索引名 on 表名 (字段);  

修改表方式创建

ALTER TABLE 表名 ADD UNIQUE 索引名(字段名);

删除索引

1.6 主键索引

主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

修改表方式创建

 ALTER TABLE 表名 add primary key(字段名);

●直接创建索引
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

●修改表方式创建
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

alter table member add fulltext remark_index (remark);

●创建表的时候指定索引
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

1.7 组合索引

可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

1.8 全文索引

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在MySQL5.6版本以前FULLTEXT索引仅可用于MyISAM引擎,在5.6版本之后innodb 引擎也支持FULLTEXT 索引。全文索引可以在CHAR、 VARCHAR 或者TEXT 类型(其余类型不可以)的列上创建。每个表一般只创建一个全文索引。


create fulltext index 索引名 on 表名 (字段);

1.9查看索引

show create table 表名;
show index from 表名;
show keys from 表名;

二、事务

2.1事务概念

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个 整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
  • 事务通过事务的整体性以保证数据的一致性。
  • 事务能够提高在向表中更新和插入信息期间的可靠性。

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

2.2事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS) 中,事务(transaction)应该具有的四个特性:原子性(Atomicity) 、一致性(Consistency )、隔离性(Isolation) 、持久性(Durability) 。这是可靠数据库所应具备的几个特性。

原子性
指在事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

事务是一个完整的操作,事务的各元素是不可分的。
事务中的所有元素必须作为一个整体提交或回滚。
如果事务中的任何元素失败,则整个事务将失败。
案例:

A给B转帐100元钱的时候只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没收到加款,在生活中就会引起纠纷。这种情况就需要事务的原子性来保证事务要么都执行,要么就都不执行。

一致性
指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

当事务完成时,数据必须处于一致状态 。
在事务开始前,数据库中存储的数据处于一致状态。
在正在进行的事务中,数据可能处于不一致的状态。
当事务成功完成时,数据必须再次回到E知的一致状态。
案例

对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中A和B的存款总额跟事务执行前一致。例如,A的账户有1000元,B的账户有1000元,现在A转账200元给B,不管事务成功还是失败,转账前后A和B的存款总额都应该是2000元。

隔离性
指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
也就是说并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

持久性

事务管理的结果。当事务被提交以后,事务中的操作命令修改的结果会被持久保存,且不会被回滚

当多个客户端并发地访问同一个表时,可能出现下而的一致性问题

脏读:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)

幻读:一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
 

隔离级别
未提交读  read uncommitted       允许 脏读 不可重复读 幻读
提交读    read committed             不允许 脏读,允许 不可重复读 幻读
可重复读  repeatable read            不允许 脏读 不可重复读,有条件的允许(InnoDB不允许) 幻读
串行读    serializable                     都不允许,相当于表级锁定,但是会影响数据库的读写效率和性能

mysql默认的事务处理级别是repeatable read,而Oracle和SQL Server是read committed 。

事务隔离级别的作用范围分为两种:

  • 全局级:对所有的会话有效
  • 会话级:只对当前的会话有效(退出连接后即失效)

 2.3查询全局事务隔离级别

查询全局事务隔离级别

variables 指变量, global variables 指全局变量。

  1. show global variables like '%isolation%'; #like 模糊查询

  2. 或 ​

  3. select @@global.tx_isolation;

  

查询会话事务隔离级别

  1. show session variables like '%isolation%';  

  2. 或  

  3. select @@session.tx_isolation;                

  4. 或 ​

  5. select @@tx_isolation;    

  

  

  

2.4设置事务的隔离级别

设置全局事务隔离级别:

set global transaction isolation level 隔离级别;

  

  

  

设置会话事务隔离级别:

会话事务隔离级别只对当前连接有效,退出连接后失效。在其他终端连接无效。再次连接后会恢复为全局事务的隔离级别。

set session transaction isolation level 隔离级别;

    

    

2.5使用 set 设置控制事务

在mysql中执行单独的命令会立即生效,是因为Mysql默认开启自动提交。

使用 set 设置控制事务


set AUTOCOMMIT=0;       #禁止自动提交(仅针对当前会话)
set AUTOCOMMIT=1;       #开启自动提交(仅针对当前会话),Mysql默认为1
show variables like 'AUTOCOMMIT';   #查看当前会话的AUTOCOMMIT值
 

  

  

自动提交关闭

    

  

  

  

  

 自动提交开启

  

  

  

  

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

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

相关文章

软件测试一些常见的误区

摘要 随着市场对软件质量的不断提高,软件测试不断受到重视,但是由于总体上,国内软件项目过程不规范,导致重视编码和轻视测试的现象,对于软件测试的重要性、测试方法和流程等还存在很多错误的认识。根据作者的软件工作…

绘制lidar点云pose

输入点云序列&#xff0c;得到点云的运动轨迹&#xff0c;并生成周围点云拼接得到的点云地图 #include <rclcpp/rclcpp.hpp> #include <sensor_msgs/msg/point_cloud2.hpp> #include <geometry_msgs/msg/transform_stamped.hpp> #include <pcl/point_clo…

(数组/字符串) 380. O(1) 时间插入、删除和获取随机元素 ——【Leetcode每日一题】

❓ 380. O(1) 时间插入、删除和获取随机元素 难度&#xff1a;中等 实现 RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#x…

Fortran IMSL库申请学生许可安装

最近使用IMSL想求个定积分&#xff0c;发现之前用的imsl7.0不支持&#xff0c;会说明许可证已经过期&#xff0c;不得不自己申请一个许可。 首先是之前的blog&#xff1a;VS2022 Fortran 配置IMSL库 这次自己申请了一个学生许可证&#xff0c;大致需要学校邮箱&#xff0c;学…

YUM 升级 PHP7

文章目录 YUM 升级 PHP71. 查看当前 PHP 信息2. YUM 安装 PHP73. 查看 PHP 版本4. 启动PHP-FPM YUM 升级 PHP7 参考地址&#xff1a;网站地址 参考地址&#xff1a;网站地址 1. 查看当前 PHP 信息 # 查看 PHP 版本信息 php -v# 查看 yum 源中 PHP 信息 yum list | grep php2. …

(c语言)数组的排序插入和删除

#include<stdio.h> void PaiXu(int arr[11]) //排序 { int i, j 0; for (i 0; i < 10; i) { for (j 0; j < 10 - i-1; j) { if (arr[j] > arr[j 1]) { int t arr[j]; …

python经典百题之static定义静态变量的方法

题目: 学习 static 定义静态变量 程序分析 在Python中&#xff0c;“static”&#xff08;静态变量&#xff09;的概念通常与类的属性相关联。虽然Python没有严格的静态变量概念&#xff0c;但可以通过类属性或模块级变量来模拟静态变量的功能。我们将探讨三种不同的方法来模…

Kafka-UI

有多款kafka管理应用&#xff0c;目前选择的是github上star最多的UI for Apache Kafka。 关于 To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself. UI for Apache Kafka is a versatile, fast, and lightweight…

工作中Git管理项目和常见问题处理

工作中Git管理项目和常见问题处理 Git仓库的管理方式为什么会出现无法push到线上处理方法 Git仓库的管理方式 共用统一仓库,不同开发人员使用不同分支 步骤 下载代码 git clone <url>查看分支 git branch创建并切换分支 git checkout -b dev分支名称保持和远程分支一…

代码随想录算法训练营第五十天 | 123.买卖股票的最佳时机III 188. 买卖股票的最佳时机 IV

1. 买卖股票的最佳时机 III 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; * 定义 5 种状态: * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出 class Solution {public int maxProfit(int[] prices) {int length prices.l…

8.2 Jmeter if控制器使用

前提&#xff1a;jmeter脚本需要用到if控制器&#xff0c;if判断如果查询不到&#xff0c;则去新增。 1、添加if控制器 线程组-->逻辑控制器-->如果(if)控制器 1&#xff09;、Expression (must evaluate to true or false) &#xff1a;表达式&#xff08;值必须是tru…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

计算机视觉与深度学习-图像分割-视觉识别任务03-实例分割-【北邮鲁鹏】

目录 参考定义Mark R-CNN结构思路Mask R-CNN训练阶段使用的Mask样例Mask R-CNN实例分割结果Mask R-CNN检测姿态 参考 论文题目&#xff1a;Mask R-CNN 论文链接&#xff1a;论文下载 论文代码&#xff1a;Facebook代码链接&#xff1b;Tensorflow版本代码链接&#xff1b; K…

用AI解决量子学问题

3 人工智能用于量子力学 在这一部分中&#xff0c;我们提供了有关如何设计高级深度学习方法以有效学习神经波函数的技术评述。在第3.1节中&#xff0c;我们概述了一般情况下定义和解决量子多体问题的方法。在第3.2节中&#xff0c;我们介绍了学习量子自旋系统基态的方法。在第…

4G工业路由器高效数据传输助力光伏发电站管理

光伏发电站是能源产业中一种利用太阳能技术将光转化为电能的常见设施。随着物联网技术与环保能源的不断进步和应用的普及&#xff0c;光伏发电站的管理也变得更加便捷高效。 光伏发电站结合4G工业路由器实现远程监控管理&#xff0c;并用于采集发电站中的传感器数据和监控信息…

Ubuntu 安装Kafka

在本指南中&#xff0c;我们将逐步演示如何在 Ubuntu 22.04 上安装 Apache Kafka。 在大数据中&#xff0c;数以百万计的数据源生成了大量的数据记录流&#xff0c;这些数据源包括社交媒体平台、企业系统、移动应用程序和物联网设备等。如此庞大的数据带来的主要挑战有两个方面…

BUUCTF:[MRCTF2020]套娃

查看源码发现 PHP非法参数名传参问题&#xff0c;详细请参考我的这篇文章&#xff1a;谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用%0a换行符绕过&#xff0c;payload: /?b.u.p.t23333%0a 得到下一步信息&#xff1a;secrettw.php 注释中的是JsFuck&#xff0c;用这…

ES6新增属性

13.ES6 1.json概述 1.什么是json 一种轻量级的数据格式键必须带双引号值如果是字符串,必须带双引号 2.json能做什么 进行网络传输,其他语言也支持json配置文件 3.json注意点 json里面不能写注释值如果是字符串,必须带引号,值如果是字符串,也必须加不能到json的后面加分号…

如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

微服务保护

1.初识Sentinel 1.1.雪崩问题及解决方案 1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞…