MySQL索引事务

发布于:2024-05-30 ⋅ 阅读:(149) ⋅ 点赞:(0)

索引

索引 类似于java中的下标 含有共同的含义,但在数据库中的含义是目录,具体就是对表中的每一列或者多列创建索引,我们知道一个大公司的数据库存在的数据量是十分庞大的(千万级别!!!),在查询某个具体的数据利用select是很麻烦的,select 的底层原理是遍历数据库中的每个表每个列来锁定数据的,时间效率非常底 时间复杂度为O(N)级别 ,相比于索引就慢了许多.索引类似于书籍的目录,可用于快速定位,检索数据

语法

索引是MySQL中一种特殊的文件,因此有专门的语法

  1. 查看索引
  2. 创建索引
  3. 删除索引
1. show index from 表名
3. create index 索引名 on 表名
4. drop index 索引名 on 表名

另外,再创建表的时候指定某个列或者多个列 为primary key,foreign key 或unique的时候 此时系统会自动为这些列带上索引,同时在进行删除的时候不能删除上述索引
索引背后所用的数据结构是b树和b+树.

引入索引,就相当于给一本书加上了目录,有了目录就能快速的查询你需求的页码,就提高了查询的速度,却消耗了额外的硬盘空间,这是个小问题,硬盘的成本是非常低的,所以基本上不做考虑.但是又引来了另一个麻烦,会影响到增删改的效率 ,一旦进行了此操作,索引的指向就需要同步的更新维护,此时就要调整索引.实际开发中,也有很多业务场景在查询的频率上比增删改的频率高的很多,所以索引确实一个不错的选择

事务

事务是用来解决一类特定的场景的问题的,例如在某个场景中完成某个操作,需要进行多个sql操作,假设这里有个账户余额表(id,money),表里数据有两行,一行是张三(1,1000) 另一行是李四(2,500),现在要求把id为1的money转500给id为2的 此时需要2条update操作

第一条:
update 表名 set money = money - 500 where id = 1;
第二条:
update 表名 set money = money + 500 where id = 2;

没有意外的话,就会出现一个问题 :假如执行了第一条sql语句后,再第二条sql语句执行前出现了BUG(主机断电等)情况 就会导致一个"整体"操作只执行了一半,此时数据库的内容就会出错了

因此所谓事务就是把多条sql语句打包成一个"整体"操作,要么这个"整体"全部执行了,要么任何一个sql语句都不会执行,这就不会因为某些不可避免的原因而导致数据库丢失.

问题一上面所说的"任何一个sql语句都不会执行" 并不是真的不执行,而是执行了又撤回了,进行了还原,不考虑过程,最终的效果就只体现了没有任何操作或者全部执行
从专业名词来讲这个机制称为 “回滚”(rollback)

问题二 回滚的操作是怎么实现的? 也就是如何撤回数据的执行了? 原因是数据库内部存在一系列的"日志体系",记录到"文件中",因此当开启事务的时候,此时每执行了一步的sql,都对数据进行了那些修改,这些修改都被记录在案,所以执行了回滚的操作,就会参考之前开始记录的位置以后的内容,再进行还原操作!\

事务的代码

start transaction;//开启事务
.......
.......//多个sql
.......
commit;//提交

事务的基本特性

1.原子性:事务中的所有操作,对结果而言:要么全部执行,要么都不执行
2.一致性:事务必须保证数据库从一个一致的状态转移到另一个一致的状态—>不会出现中间状态(临时状态)
3.持久性:一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障也不会丢失!
4.隔离性: 并发执行的事务不会相互影响

什么是并发执行?

事务的并发执行是指在数据库中,多个事务能够同时进行,而不是一个接一个地依次执行.,因为数据库是一个" 客服端–服务"结构的程序,一个服务器会个多个客服端同时提供服务.所以这种并发执行可以提高数据库的效率和性能

虽然并发执行可以提高数据库的效率,但也可能会带来一些问题;
主要问题包括
1.脏读:一个事务读取了另一个事务未提交的更改数据.如果那个事务最终回滚了,那么读取的数据将是无效的;
2.不可重复读:一个事务重新读取之前已经读取过的数据,发现数据已经被前提事务更改.这就违法了事务的隔离性;
3.幻读 一个事务执行一个查询,由于其他事务的更新,它看到了之前不存在的行.通常发生在范围查询中

等等~~

总结


网站公告

今日签到

点亮在社区的每一天
去签到