Mysql语法四:索引查找和了解何为事务

本文介绍了MySQL的索引和事务。在创建主键、唯一键和外键约束时会自动生成索引,通过`show index from 表名;`可查看索引,使用`create index`创建索引,`drop index`删除索引。索引基于B+树数据结构,优化查询性能。事务具有原子性、一致性、持久性和隔离性四大特性,防止并发操作带来的数据错误。事务的并发问题包括脏读、不可重复读和幻读。
摘要由CSDN通过智能技术生成

目录

1.索引

1.1:使用

1.1.1:查看索引

 1.2.2:创建索引

1.1.3:删除索引

1.2:索引查询的原理

1.2.1:何为 B+树

2.事务

2.1:特性

2.1.1:原子性

2.1.2:一致性

2.1.3:持久性

2.1.4:隔离性

2.2:事务之间相互影响的种类

2.2.1:脏读

2.2.2:不可重复读

2.2.3:幻读


前言:我们前一篇讲了怎样多表之间联合查询,这样的查找效率不高,所以我们这篇将要将一个快的查找,索引---相当于我们书的目录

1.索引

1.1:使用

在创建主键约束(Primary key),唯一约束(Unique),外键约束(Foreign key)时,会自动创建对应列的索引。

1.1.1:查看索引

show index from 表名;

1a89877f8a454dbb8f5cafc0342b04f6.png

 1.2.2:创建索引

create index 索引名(你取得别名) on 表名(列名--你想变成索引的列);

e39c06def95145639316a6b7ad76ad64.png

最好是在表创建之初就把索引给搞好。

如果在已经有很多条数据的表来创建索引,会吃掉大量的磁盘,系统,在这段时间类,数据库是无法正常的进行工作的。

1.1.3:删除索引

drop index 索引名 on 表名;

88d97239a4ae4c15814224b01cfea7cc.png


1.2:索引查询的原理

索引保存的数据结构主要为B+树。

1.2.1:何为 B+树

2645bb04115b4cbdbbc999b35f53a551.png

1.B+树又叫N叉搜素树,每一个节点上包含N个key值,N个key划分N个区间,最后一个Key就是最大值。

2.父节点的元素会重复出现在子节点上,这样是叶子节点包含了所有数据。

3.叶子节点,用类似链表的方式,首尾相连。

带有主键的表,就是按照主键索引的B+树来组织的。

优点:

1.高度降低下来,比较的时候,硬盘IO次数就比较少。

2.适合范围查询

3.所有的查询,都是落在叶子节点上的,无论查询哪个元素,中间比较的次数差不多,查询操作比较均衡。

假如:索引是主键列id号。

baecd4c72e484171848b62772484a254.png

 叶子节点:存放了索引信息和data域。

非叶子节点:只存放了索引信息。

如果索引不是主键列

会构造另外一棵B+树,非叶子节点存放的是索引,而叶子节点存放的不是完整的数据行,而是主键。

使用主键列来查询,只要查一次B+ 树就可以了

而使用非主键列的索引来查询,则需要先查询一遍索引的B+树,再查一遍主键列的索引的B+树。(这个叫回表)。


2.事务

数据库事务是访问并可能操作各种数据项的一个数据库操作的序列。事务处理可以用来维护数据库的完整性,保证成批的Mysql语句(insert update delete)那么全部成功,那么全部失败。

2.1:特性

2.1.1:原子性

原子性就是把一个事务中的所有操作打包成一个整体,那么全部成功,那么全部失败。如果中间有一个操作失败,就会自动恢复到执行之前的样子,就像这个事务从来没有执行过。也叫做回滚(把执行过的操作逆向恢复回去)。

例如:

张三给李四转100块钱,首先会在张三的账户上扣除一百块钱,等李四收取,之后在李四的账户上增加一百块钱。

这一天,转钱的时候,张三断网了。这就说明这个事务已经失败了,就要进行回滚,从张三的账户上扣除一百块钱进行逆向操作,使张三的账户金额不变。就像没有发生转钱这件事。


2.1.2:一致性

事务执行前和事务执行后都是将数据合法的状态,符合预测规则。

如上个例子:

一致性就是,张三账户扣除的钱和李四账户增加的钱要一样多。


2.1.3:持久性

事务一旦提交,对数据库的改变都是永久的,事务产生的修改都会存入到硬盘中。

2.1.4:隔离性

数据库使允许多个事务同时进行操作,隔离性就是防止多个事务并发执行由于交叉而导致数据错误。

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

2.2:事务之间相互影响的种类

2.2.1:脏读

就是两个事务并发执行(如 读,写)读这个事务读入了错误的数据就是脏读。

例如:

写这个事务:张三给老师上传作业。

读这个事务:老师就立马批改这个作业。

写修改这个事务:张三过了一会儿,感觉自己有道题写错了,再一次上传了自己修改过的作业。

脏读:但老师已经把张三第一次上传的作业批改完了。

这是因为读和写这个两个事务是完全并发的。


2.2.2:不可重复读

为了解决脏读问题,我给写加锁(我在写的时候,你不能看,等我写完了,你才可以看)

不可重复度:在一个事务中。连续两次读到的数据结果不一样。

例如:

老师下一次布置作业的时候,规定提交的时间(时间之后可以修改作业)。

写:张三在提交结束前上传了作业。

读:老师正在批改张三的作业。

写:这时候,有道题,张三突然有解题思路,又把作业进行修改,再次提交了作业。

读:老师批改张三作业和之前的不一样了。看不到修改前的那道题是怎样写的。


2.2.3:幻读

为了解决不可重复读,给读加锁,(我在读的时候,你不可以修改)

幻读:在同一个事务中,两次读到的结果集不一样。

例如:

老师下一次布置作业,规定在提交作业时间之后不可以再次修改作业。

写:张三提交了作业。

读:老师进行批改作业,看现在提交作业人数有27人。

写:李四问张三有啥作业,却被告之,少写了一道题。又将作业进行撤回。

读:老师批改到一半,看现在提交作业人数只有26人。

在同一个事务中,两次读的结果集不一样。


总结

以上就是我总结的Mysql的索引和事务,若上面若错误的,请各位铁子留言纠错,若感觉不错,请一键三联。

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值