首页 > 数据库 >MySql索引及简单的事务分析

MySql索引及简单的事务分析

时间:2023-12-25 16:00:56浏览次数:41  
标签:事务 隔离 并发 MySql 索引 SQL 上锁

索引 什么是MySql索引? 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。包含着对数据表里所有记录的引用指针。

索引的易忽略点: 索引相当于书的目录,可以加快查找的速度,但同时也提高了增、删、改的开销;

索引也提高了空间的开销,构造索引也就需要额外的硬盘空间来保存;

    数据库的索引与数组的索引没有任何关系。只不过都是使用了index这样的术语。实际            上数组的index一般翻译成下标,而数据库的index一般翻译成索引

索引在MySql中的数据结构:

        其实,B树已经可以比二叉树更适合于做数据库的索引了,但还是不够,又引入了B+树,是对B树进行了进一步的改进;

如图所示:

MySql索引及简单的事务分析_主键

作为一个 N 叉搜索树,高度降低下来,比较的时候,硬盘 IO 次数就少了; 叶子结点之间通过链表链接,更适合范围查询; 所有的查询都要落在叶子结点上,无论查询哪个元素,中间的比较次数都差不多,查询操作比较均衡; 如果有的表不只是有主键索引,还有别的非主键列也有索引,这个情况就会构造另一棵B+树,此时需要先查一遍索引列的 B+ 树,再查一遍主键列的 B+ 树,称之为“回表”;

事务 介绍:

1. 一个事务可以是一条SQL语句,一组SQL语句或整个程序。 事务可以把多个SQL打包到一起,变成一个整体。

    2.事务是恢复和并发控制的基本单位。如何理解? 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。如果失败,就会回滚到最初的状态;简单而言即为如果一个事务进行的整个过程不出现错误而顺利执行到终止,如果中途遇到错误,就会终止进行并恢复到事务初始状态。

使用方法: 第一步:开启事务 start transaction;

第二步:执行多条语句;

第三步:回滚或提交:rollback 或 commit;

(rollback即全部失败,commit即全部成功)

事务的核心特性: 1.原子性:

上面已经介绍到,事务可以将多个SQL打包起来,因此就具有原子性;

2.一致性:

事务执行前后都得是数据合法的状态;

3.持久性:

事务对SQL数据的记录总是与硬盘同步;

4.隔离性:

同时执行多个事务时,事务之间的影响程度,下面将具体介绍;

隔离性: 当多个客户端之间同时发起事务时:

如果隔离性越高,就意味着事务之间的并发程度越低,执行效率越慢,但数据的准确性越高;

如果隔离性越低,就意味着事务之间的并发程度越高,执行效率越快,但数据的准确性越低;

隔离的常见问题: 1.“脏读问题”:读到了错误数据; 例如:当我们从数据来源处读取了一段信息,但读取过后,来源处的这些信息又被改掉了或被删除了,这样就会发生脏读问题。 解决办法:降低并发性,提高隔离性,对“写操作”加锁。这样一来写的过程中不可读,写完了才可以读,就保证了安全性。同时这样操作花费的时间更长,但提高了数据来源的准确性。

2.“不可重复读问题”:在一个事务中,第一次读取到的数据在第二次读取过程中被修改。

解决办法:对 “读操作” 上锁。读的过程中不能写。

    既然有“写上锁”和“读上锁”,那上锁的过程中,另一方就不能闲着呀,所以就有这样的写法:上面这些是针对同一个代码文件而言的,但是除此之外,我们可以让闲着的部分去处理其他文件,这样操作的话又可能会导致原来读到的代码没变,但文件数量变了;

3.“幻读”问题:在同一个事务中,两次读到的结果集不同。

解决办法:串行化,彻底舍弃并发

标签:事务,隔离,并发,MySql,索引,SQL,上锁
From: https://blog.51cto.com/u_13529088/8969623

相关文章

  • MySQL运维15-一主一从读写分离
    一、读写分离介绍读写分离,是把数据库的读和写分开操作,以应对不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力。二、一主一从原理MySQL的主从复制是基于二进制(binlog)实现的说明1:当主服务器的MySQL执行了DM......
  • Elasticsearch 创建索引
    使用Elasticsearch创建索引步骤:打开Elasticsearch的命令行工具(如cURL或Elasticsearch提供的Kibana工具)或集成开发环境(如Elasticsearch的官方客户端库或第三方客户端库)。使用HTTP请求的PUT方法创建索引。需要指定索引的名称,以简单的字符串表示。使用以下命令创建名......
  • 一招让order by id索引失效!
    测试用例CREATETABLE`sbtest1`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`k`int(10)unsignedNOTNULLDEFAULT'0',`c`char(120)NOTNULLDEFAULT'',`pad`char(60)NOTNULLDEFAULT'',PRIMARYKEY(`id`),KEY......
  • 18 事务必须遵循ACID这4个特性
    事务必须遵循ACID这4个特性。分别代表原子性、一致性、隔离性、持久性。原子性就代表,事务的执行和回退是一个整体,事务中包含的sql要么全部执行,要么全部回退。一致性就是,事务执行前后,数据库都是处于一致性状态中。隔离性就是,事务在提交之前,对于其它事务都是不可见的。直到提交时。持......
  • mysql设计表名称要不要加表前缀
    在MySQL中设计表时,是否添加表前缀主要取决于你的具体需求和设计考虑。以下是一些关于是否使用表前缀的考虑因素:1,避免表名冲突:如果你的应用程序要与其他应用程序或系统共享数据库,或者你预计将来会有多个应用程序或系统使用同一个数据库,使用表前缀可以帮助避免表名冲突。例如,你......
  • 谷歌搜索引擎数据采集工具
    谷歌搜索引擎数据采集工具(“大镜山谷歌搜索数据采集器”,官网168318.com),基于谷歌搜索引擎的数据采集软件。根据用户输入的关键词,实时采集采集谷歌的搜索结果。其智能挖掘功能非常强大,采集的数据包括网站、标题、描述、邮件地址、手机或电话号码、facebook、linkin、twitter、youtube......
  • MYSQL varchar和nvarchar一些学习
    MYSQLvarchar和nvarchar一些学习背景先试用utfmb3的格式进行一下简单验证注意脚本都是一样的.createdatabasezhaobsh;usezhaobsh;createtablezhaobsh(zhaobshvarcharvarchar(30),zhaobshnvarcharnvarchar(30));insertintozhaobshvalues('123abc','1......
  • MySQL 查看版本的 5 种方法
    mysql数据库查看版本号SELECTVERSION();linux查看版本号mysqld-Vmysql-version 方法一:登录MySQL每次通过mysql客户端连接服务器之后,都会显示一个欢迎信息,里面包含了服务器的版本:mysql-urootEnterpassword:******WelcometotheMySQLmonitor.Commandsend......
  • 第81讲:清理MySQL Binlog二进制日志的方式
    1.清理Binlog二进制日志的依据Binlog日志非常重要,但是占用的磁盘空间也很大,我们也需要定期的去清理二进制日志,在MySQL数据库中,提供了自动清理Binlog日志的参数,根据指定的天数,保留n天内的Binlog日志,也可以手动人为删除。在手动删除Binlog日志时,要切记不要使用rm-rf直接删除Binlog......
  • MySQL 主从故障排查
    MySQL主从复制是一种常见的数据库架构,用于提高数据库的可用性和性能。但是,在实际应用中,主从故障是难免的。本文详细介绍一套MySQL主从故障排查方案。一确认主从状态首先要确定主从复制的状态,可以通过执行以下命令来检查:1)SHOWMASTERSTATUS;命令用于显示主库的状态信息,包括以下列......