数据库的索引与事务

索引

索引的概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。索引就好比字典的(拼音和部首查字一样),可以帮助我们快速的查找想要的信息。

索引的作用

就一句话,加快查询数据的速度。

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。
    在这里插入图片描述

索引使用场景

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

1.数据量较大,且经常对这些列进行条件查询。
2.该数据库表的插入操作,及对这些列的修改操作频率较低。
3.索引会占用额外的磁盘空间,所以磁盘空间需要充足。(存放在磁盘的.ibd文件里)

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

不适合使用的场景

(1)对于插入、删除数据频率高的表,不适用索引
(2)对于某列修改频率高的,该列不适用索引
(3)通过某列或某几列的条件查询频率高的,可以对这些列创建索引

索引的使用

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

查看索引 show index from 表名;

创建索引:对于非主键、非唯一约束、非外键的字段,可以创建普通索引

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

删除索引

drop index 索引名 on 表名;

索引保存的数据结构主要为B+树,(一颗特殊的二叉搜索树)及hash的方式.

MYSQL的隔离级别

出现隔离的原因:
1、脏读:一个事务中读取到数据是错误的数据,例如事务A读取到了正在执行的事务B修改过的数据,但事务B并没有进行提交。而A读后事务B执行了回滚操作,对数据的更改也就撤回了,即数据值还是原来值,而A读到的是B修改过后的值。

2、不可重书读:事务A使用同一个查询条件,读取到的内容不一致,(其他事务修改了该值且提交了事务)

3、幻读:事务A使用相同的查询条件,两次查询的数据个数不一样。例如事务A查询1班所有人的信息时,查到了11个人,紧接着事务B又插入(或者删除一个数据)了一个同学的信息,而A有查询了一遍,发现居然变成了12个人,就类似自己出现幻觉一样,因此成为幻读。

幻读和不可重复读的区别?
侧重点不同,不可重复度的侧重点是修改,幻读是添加或者删除。
为了解决以上的问题出现了事务的隔离级别。
Mysql的四种隔离级别

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

  • Read Uncommitted(读取未提交内容)
    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
    就好比还没确定的消息,你却先知道了发布出去,最后又变更了,就是说瞎话了。常说的脏读,读到了还未提交的。

  • Read Committed(读取提交内容)
    这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

  • Repeatable Read(可重复读)
    这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题

  • Serializable(可串行化)
    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
    事务顺序执行,没有并行,完全杜绝幻读。

事务

为什么要使用事务

通过下面的例子来说明:

drop table if exists accout; 
create table accout(
id int primary key auto_increment,
name varchar(20) comment ‘账户名称’,
money decimal(11,2) comment ‘金额’
);

insert into accout(name, money) values (‘阿里巴巴’, 5000),(‘四十大盗’, 1000);

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元

– 阿里巴巴账户减少2000
update accout set money=money-2000 where name = ‘阿里巴巴’;
– 四十大盗账户增加2000
update accout set money=money+2000 where name = ‘四十大盗’;

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是 四十大盗的账户上就没有了增加的金额。那么钱去哪里了呢,不翼而飞了?这时候我们就需要使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

事物的概念

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

事务的四大特性(ACID)

1、原子性:要么全部成功(commit结束事务),要么全部失败(rollback进行回滚)
2、持久性:事务执行的结构一定要永久保存下来。
3、一致性:事务执行前和执行后,数据必须保证正确的
4、隔离性:多个事务在执行的时候要相互隔离

事务的使用

事务三板斧

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
例如:

start transaction;--开启事务
– 阿里巴巴账户减少2000
update accout set money=money-2000 where name = ‘阿里巴巴’;
– 四十大盗账户增加2000
update accout set money=money+2000 where name = ‘四十大盗’;
commit;--执行commit说明正常结束

查表时可以不开启事务,但增删改一定要开启事务,以保证数据的安全与准确,防止断网等事故造成的错误;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值