> 文章列表 > 【MySQL】索引事务

【MySQL】索引事务

【MySQL】索引事务

摄影分享~
【MySQL】索引事务
【MySQL】索引事务

文章目录

  • 索引
    • 概念
    • 使用场景
    • 使用
  • 事务
    • 概念
    • 使用
    • 事务的特性

索引

概念

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

使用场景

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

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

使用

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

  • 查看索引
show index from 表名;

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

  • 创建索引
    对于非主键,非唯一约束,非外键的字段,可以创建普通索引。
create index 索引名 on 表名;

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

  • 删除索引
drop index 索引名 on 表名;

【MySQL】索引事务
SQL是通过数据库的执行引擎来执行的,此处涉及到一些“优化”操作
索引其实是不好预期的,我们可以使用explain这个关键字,显示出查询过程中具体的使用索引的情况。
【MySQL】索引事务
索引在mysql中的数据结构是什么?
索引的主要目的是为了加快查找速度。
N叉搜索树,每个节点上有多个值,同时有多个分叉。数的高度就降低了。
其中一种典型的实现,叫做B树。
【MySQL】索引事务
比较次数虽然没有减少,但是读写硬盘的次数减少了。
B树已经可以比二叉搜索树更适合于做数据库引擎了,但是还不够。针对这里,又引入了B+树。是对B树的进一步改进。B+树就是为了索引这个场景,量身定做的数据结构。
【MySQL】索引事务

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

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

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

由于非叶子节点只存了简单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的配置文件来进行调整的。