MySQL-索引事务

        

目录

1.索引

        1.1 何为索引

        1.2 索引的用法

2.索引背后的数据结构

3. 事务

        3.1 为啥用事务

        3.2 事务

4.事务的特性

5.总结:


1.索引

        1.1 何为索引

索引本质上就相当于书的“目录”,数据库通过这种“目录”,就可以快速找到某个章节对应的位置。

因此索引就是增加了数据库对查找数据的深度!

在前面学习过数据结构之后,我们就知道索引提高了查找效率的代价必定是增加对空间的开销!

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

        1.2 索引的用法

创建 primary key unique foreign key 时 会自动创建对应列的索引

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

·查看索引

因为id时primary key 所以自动创建了索引

·创建索引

creat index 索引名 on 表名(列名)

 创建索引的时候,最好在建表的时候就创建出来,否则,如果一个表有很多的记录,再来穿就按索引是非常危险的!

会吃掉大量的磁盘IO,花费很长的时间

1 索引是为了加快查询的速度,也不是所有的情况加上索引就一定快~~

2 如果name 的数据 有重复,索引能不能加上,会不会报错?不会报错,能加上.

3 只要你重名不是很多,这个时候,还是能大大提高查询的速度点.

·删除索引

这一次查询如果想知道是不是用的索引,可以使用explain关键字,显示处查询过程中,具体的使用索引情况!

explain语句可以分析sql的执行逻辑,顺序,是否使用索引等等。

索引提高查的效率,但会是降低其他的操作的效率(需要调整已经创建好的索引)

2.索引背后的数据结构

         我们知道查找这一操作有时候可能会需要范围查询,但似乎哈希表并不能> 或者 < 因此,哈希表并不行~~

        如果是二叉搜索树呢?可以实现范围查询,但是当数据多的时候,也就是元素个数多的时候,树的高度就会变大,而树的高度决定了查找的效率! 树的高度就需要控制~~

        这时候就需要n叉搜索树(就是 每个节点有多个值 有多个分叉)~~

       其用来控制树的高度、

        而其中 最典型的实现就是 B树~~

数据库的看到的这个表 不一定按连续的空间来组织表这样的结构,很大概率是B+树(尤其是带主键的)

 因此 提高查询的速度 本质就是降低IO操作

3. 事务

        3.1 为啥用事务

在转账的情景下 : A向B转账100元,A的账户-100 而B确实+50 这显然是不合理的,因此只要出现这个操作就需要截止!

因此可以把+100 和 -100打包成一个操作,只要一个没执行完成 ,就全部推翻重来~~
 

        3.2 事务

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

4.事务的特性

        1.原子性                

        2.一致性        事务执行前/执行后,都是数据合法的状态,像刚才的转账,不能说转的过程出错了,导致钱丢的情况

        3.持久性        事务的修改都是写入硬盘的

        4.隔离性        一个数据库服务器同时 执行多个事务的时候 事务之间的 相互影响程度!

mysql服务器是需要给多个客服端提供服务的

有时候会同时有多个客服端对服务器进行访问,这时候会引发一些问题

隔离性越高,事务之间的并发性越低,执行效率就变满,数据的准确率就提高

隔离性越低,事物之间的并发性越高,执行效率就变满,数据的准确率就降低

因此mysql提供了不等隔离级别让我们选择~~

在学习不同的隔离级别之前,先学习一下~~

1.脏读问题

假设A向B抄作业,但是A抄写的方式和他人不同,A是和B边写边抄,突然B把前面的作业全部修改了,这时候A非常崩溃,这就是所谓的脏读问题~~

这些A已经抄写的数据就叫 脏读数据(dirty data) 意思是这个数据有问题~~

在这个场景中,A和B是完全并发的,不存在任何限制~~

解决方法很简单:降低并发性,增加隔离性~~(其实就是对“抄操作”进行上锁)~~

但上锁的时候,意思就是B在写作业的时候,不允许A进行“抄操作” ———相当于提高了隔离性,降低了并发性,运行效率降低,但是准确性相对的提高

2.不可重复性

当B写完作业交给A抄写的时候,突然B发现有一个作业写错了,这时候又要拿回作业重写,A又再一次的崩溃了~~

在一个事务中,连续俩次读到的数据,结果是不同的,这就叫做“不可重复性”

那么如何解决呢?

也很简单,在A抄作业的时候,就限制B不能拿回作业,也是对其上锁

这时候,这俩事务的并发程度又降低了,隔离性提高,运行效率进一步降低,提高了准确性

3.幻读问题

虽然啊,在B写作业的时候和A抄作业的时候都上锁了,但是B可以在A抄作业的时候,可以把作业拿走撕了,也可以再写其他的作业(给其再添加/删除 文件)A又双叒叕崩溃了

 在同一事务中,连续俩次结果集不同,就叫做幻读

解决其方法:

彻底的舍弃并发


5.总结:

       

索引用在查询多的场景,大部分数据库引擎的索引背后的数据结构都是B+树,但也有例外   

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

事务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值