前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MySQL】索引事务

【MySQL】索引事务

作者头像
xxxflower
发布2023-04-16 17:50:04
2710
发布2023-04-16 17:50:04
举报
文章被收录于专栏:《数据结构》《数据结构》

索引

概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型,各类索引有各自的数据结构实现。 通过目录,就可以快速的找到某个章节对应的位置。=》索引的效果,就是为了加快查找的速度。

使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。 满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。 反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引

使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  • 查看索引
代码语言:javascript
复制
show index from 表名;
在这里插入图片描述
在这里插入图片描述

表里如果有主键,主键这一列就会自动创建索引。 unique和foreign key也会自动创建索引。

  • 创建索引 对于非主键,非唯一约束,非外键的字段,可以创建普通索引。
代码语言:javascript
复制
create index 索引名 on 表名;
在这里插入图片描述
在这里插入图片描述

创建索引,最好的方式是在表创建之初就把索引做进去了。否则,如果是针对一个表中已经有很多很多记录来创建索引。这是一个很危险的操作。

  • 删除索引
代码语言:javascript
复制
drop index 索引名 on 表名;
在这里插入图片描述
在这里插入图片描述

SQL是通过数据库的执行引擎来执行的,此处涉及到一些“优化”操作 索引其实是不好预期的,我们可以使用explain这个关键字,显示出查询过程中具体的使用索引的情况。

在这里插入图片描述
在这里插入图片描述

索引在mysql中的数据结构是什么? 索引的主要目的是为了加快查找速度。 N叉搜索树,每个节点上有多个值,同时有多个分叉。数的高度就降低了。 其中一种典型的实现,叫做B树。

在这里插入图片描述
在这里插入图片描述

比较次数虽然没有减少,但是读写硬盘的次数减少了。 B树已经可以比二叉搜索树更适合于做数据库引擎了,但是还不够。针对这里,又引入了B+树。是对B树的进一步改进。B+树就是为了索引这个场景,量身定做的数据结构。

在这里插入图片描述
在这里插入图片描述
  1. B+树也是一个N叉搜索树,每个节点上可能包含N个key,N个key划分出N个区间,最后一个Key就相当于最大值。
  2. 父元素的key会在子元素中重复出现,并且是以最大值方式出现的(**这样的重复出现,导致叶子节点就包含了所有数据的全集。非叶子节点中的所有值都会在叶子节点中体现出来。 **)
  3. 会把叶子节点,用类似于链表的方式,首尾相连。

上述B+树,就带来了一些好处。

  1. 作为一个N叉搜索树,高度降下来,比较的时候,硬盘IO次数就比较少了。
  2. 更适合进行范围查询
  3. 所有的查询,都是要落在叶子节点上的,无论查哪个元素,中间比较的次数差不多,查询比较均衡
  4. 由于所有key都会在叶子节点中,只需要把所有的数据行放在叶子节点中即可。
在这里插入图片描述
在这里插入图片描述

由于非叶子节点只存了简单id,没有存一整行,这就意味着非叶子结点占用的空间是大大降低的。有可能在内存中可以放进去缓存,更进一步降低硬盘IO。 有的表,不只是主键索引,还有别的非主键列,也有索引。(这个情况会构造另一个B+树,B+树非叶子节点里面存的都是这一列里面的key,到了叶子节点这一层,不是存之前完整的数据行,而是存主键id) 使用主键列来查询,只要查一次B+树就可以了。如果使用非主键列的索引来查询,则需要先查一遍索引列的B+树,再查一遍主键列的B+树。 B+树这个结构,只是针对MySQl的InnoDB这个数据库引擎,里面所典型使用的数据结构。 不同的数据库,不同的引擎,里面的存储数据的结构还可能存在差异。

事务

概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

使用

(1)开启事务:start transaction; (2)执行多条SQL语句 (3)回滚或提交:rollback/commit; 说明:rollback即是全部失败,commit即是全部成功 回滚rollback:回滚就是把执行过得操作逆向恢复回去。类似于电脑上的ctrl+z 。

事务的特性

  1. 原子性:把多个操作打包成一个整体,就叫做原子性。“原子性”是事务最核心的特性。
  2. 一致性:事务执行前后,都得是数据合法的状态。
  3. 持久性:(持久=>硬盘)事务产生的修改,都是会写入硬盘的。即使程序重启,事务都可以正常工作。保证修改是生效。
  4. 隔离性(重点):一个数据库服务器。同时执行多个事务的时候,事务之间的“相互影响程度”。

mysql服务器,要同时给多个客户端提供服务。此时多个客户端之间,可能会同时发起事务,尤其是这多个事务在操作同一个数据库的同一个表的时候,就可能引起一些麻烦。 如果隔离性越高,就意味着事务之间的并发程度越低,执行效率是越慢,但数据的准确性是越高的。 如果隔离性越低,就意味着事务之间的并发程度越高,执行效率是越快,但数据的准确性是越低的。 有时候根据我们的需求不同,对执行效率,准确性的要求就不同。(具体场景,具体实现) mysql给我们提供了不同档位即mysql的隔离级别(就可以控制隔离性的高低、并发程度的高低,执行效率的高低,数据准确性的高低)

举个例子: 有一天,A看到B正在写一道很难的高数题,正好A也不会,就瞄了一眼B的做题记录。在A瞄完之后,B发现自己的做题思路错了!然后把之前的做题记录修改了。A瞄到的记录实际上是错误的。这种情况,就称为**“脏读”问题(dirty data)(即读到的这个数据有问题!)**。解决脏读问题的办法,就是降低并发性,提高隔离性。具体来说,就是给B的做题过程加密。也就是B做的时候,A不要看!当达成这个约定后,B在完成这个困难的高数题之后,A再看。A看的时候,此时B觉得自己还闲的不行。就想做这个高数题的扩展部分。B在做的时候发现原题可以有更好的解法,就把答案给改了。此时A看到的答案突然又被改了。此时这个情况就叫做“不可重复读”(即一个事务中,连续两次读到的数据,结果不一致)。如何解决这个问题呢?给读这个操作,也加锁~也就是A在看B的答案的时候,B不能修改!这两个事务之间的并发程度,进一步降低了。隔离性提高了,但与此同时,运行速度又进一步变慢了。但数据的准确度又进一步提高了。B说你小子!得,你慢慢看。我不改了!我去做大学物理题!省的我在这闲着!此时 A读到的高数题内容虽然没有变,但是他发现B在这段时间写的作业量变了!这个问题,就叫做“幻读问题(即在同一个事务中,两次读到的结果集不同)

针对以上情况,MySQL提供了四个隔离级别。

  1. read uncommitted:不做任何限制,事务之间都是随意并发执行的。并发程度最高。隔离性最低,会产生脏读+不可重复读+幻读问题。
  2. read committed:对写操作加锁了。并发程度降低了,隔离性提高了。解决了“脏读”问题,仍然存在不可重复读+幻读
  3. repeatable read:对写和读都加锁了,并发程度又降低了,隔离性又提高了。解决了脏读和不可重复读的问题,可能存在幻读问题。
  4. serializable:严格串行化,并发程度最低,隔离性最高,解决了脏读+不可重复读+幻读问题,执行速度最慢

在实际开发中就可以根据当前要解决的问题的需求场景,来决定来使用哪个隔离级别。 通过mysql的配置文件来进行调整的。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 索引
    • 概念
      • 使用场景
        • 使用
        • 事务
          • 概念
            • 使用
              • 事务的特性
              相关产品与服务
              云数据库 MySQL
              腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com