MySQL
索引事务
索引
概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
作用
1.数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
2.索引所起的作用类似书籍目录,可用于快速定位、检索数据。
3.索引对于提高数据库的性能有很大的帮助。
索引带来的好处,提高了查找的速度.带来的坏处,占用了更多的空间,拖慢了增删改的速度(这个查找是在内存中完成的,而MySQL
中的比较是在硬盘上完成的)
使用
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
1.查看索引
show index from 表名;
案例:查看学生表已有的索引
show index from student;
2.创建索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引(这是个低效的操作,数据非常大的时候会消耗很多时间)
create index 索引名 on 表名(列名);
案例:创建班级表中,name字段的索引
create index name_index on student(name);
3.删除索引
这也是个低效的操作,数据非常大的时候会消耗很多时间(推荐创建表的时候就创建好)
drop index 索引名 on 表名;
案例:删除班级表中name字段的索引
drop index name_index on student;
索引背后的数据结构
二叉搜索树:查找时间复杂度O(n)(最坏情况下单枝树也就是链表)可是它要求过于苛刻后续的增删改太耗时间了
红黑树: 虽然要求宽松点平衡二叉树,但是二叉树主要的问题是元素多了,树的高度就高了.比较次数就多了(每次比较都是磁盘IO,耗时大)
哈希表: 虽然查找时间复杂度O(1),但是哈希表只能对"相等"进行判断,不能对"大于小于"以及范围进行查找(不合适)
堆: 只能找到最大值或者最小值(不适合)
多叉搜索树(n搜索叉树):在数据库索引中最常见的数据结构是B+树 (B树最大的意义就是减少了磁盘IO的次数(依次读取多个数在内存中比较))
事务
事务的概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。(原子性)
在SQL
中,有的复杂的任务需要多个SQL
来执行.在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。有的时候,也同样需要打包在一起,前一个SQL
是为了给后一个SQL
.提供支持.如果后一个SQ
L不执行了或者执行出问题了,前一个SQL
也就失去意义了.
事务的应用场景
典型的就是转账
事务是如何实现保证上述机制的: 核心就是回滚.(回滚的依据就是MySQL
要记录之前执行的一些过程)
使用
--(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;
事务的基本特性
四个基本特性:
-
原子性:要么全都执行完,要么一个都不执行.任务不可以被再细分了.
-
一致性: 在事务执行之前,和执行之后,数据库中的数据都得是合理合法的数值
-
持久性: 事务一旦提交了之后,数据就持久化的存储起来了(数据就写入硬盘了)
-
隔离性: 隔离性描述的是,事务并发执行的时候产生的情况!!!(并发执行就像大家一起线上填写一张表格,有人不小心填写了你的那一栏表格的数据)
脏读问题:就是某个进程没有读取之前进程最终的数据,而是其中临时的值去操作(写的时候不能读)
不可重复读问题: 读的时候不能写.
总之: 提高隔离性就会降低并发效率,它们是互斥的
幻读问题: 彻底串行化执行(隔离性最高,并发性最低,数据最可靠,速度最慢)
MySQL
中事务的隔离级别
-
read uncommitted
:允许读取未提交的数据.并发程度最高,隔离程度最低会引入脏读+不可重复读+幻读问题~~ -
read committed
:只允许读取提交之后的数据相当于写加锁.并发程度降低了- -些,隔离程度提高了- -些解决了脏读,会引入不可重复读+幻读. -
repeatable read
:相当于给读和写都加锁.并发程度又降低了.隔离程度又提高了.解决了脏读和不可重复度,会引入幻读. -
serializable
:串行化.并发程度最低(串行执行),隔离程度最高.解决了脏读,不可重复度,幻读问题,但是执行速度最慢~
可以通过修改my.ini
这个配置文件,来设置当前的隔离级别.根据实际需求场景,来决定使用那种隔离级别.