索引和事务
索引
索引是什么?
索引是对数据库表中一列或多列的值进行排序的一种结构,通过此结构我们可以大幅度的提高查找效率
索引类似字典的目录,可以通过索引快速查找目标数据
索引的分类:
- 普通索引: 提高查找效率
- 唯一性索引:索引列中的
值
必须是唯一的不能重复的
,但是允许空值 - 主键索引(聚簇索引):即表中
主键
列 - 全文索引:
只能
在char varcahr test类型上使用全文索引,并且只能
在MylSAM引擎上才能使用 - 组合索引: 在表中的多个字段组合上创建的索引,只有在查询条件中只用了这些字段左边的字段,索引才会被使用比如:
where a=3 and b=45 and c=5 … 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5… 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4… 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=45 and a=3 and c=5 … 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关
索引的优缺点
索引的优点
- 大大加快了
检索
速度 - 创建的
唯一索引
可以保证每一行数据的唯一性 - 加速表与表之间的连接
- 在使用
分组和排序子句
进行`数据检索时,可以显著减少查询中分组和排序的时间
索引的缺点
- 占用空间内存太大
- 创建的速度太慢
- 当表中的数据进行更新时,索引也会更新(耗时)
索引的建立原则
- 建立在
不经常更新
的字段上 - j建立在
数据量较大
的表上 - 建立在
数据重复率低
的字段上
事务
事务是什么?
事务是实际开发中,比较常见业务逻辑操作中都会存在问题,比如转账的业务
,需要将一个账户的钱转向到另一个账号,此时会涉及到两个修改操作:A账户钱减少,B账户钱增加;这两个操作要保证能同时成功或者同时失败
,那么这一个业务需求(逻辑单元)
就称之为一个事务。
事务的四大特性
- 原子性 : 对于事务的执行,要么都成功,要么都失败
- 一致性 : 保证事务操作完成后,所有的数据结果都一致
- 隔离性 : 事务之间各自独立存在相互不影响
- 持久性 : 事务完成后,确保所有的数据长期持有久存在
事务隔离级别
由于实际的业务操作可能会涉及到很多事务的并发操作,因此在事务并发时可能会遇到以下问题:
- 丢失更新: 撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
- 脏读:事务A读取了事务B更新的数据,而此时事务B并未提交,那么A读取到的数据是脏数据
- 不可重复读: 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新
并提交,导致事务A多次读取同一数据时,结果 不一致。 - 幻读: 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B
就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有
改过来,就好像发生了幻觉一样,这就叫幻读。
对于这种问题数据提供了隔离级别的解决方案
read-nucommitted 安全性最低 会发生 脏读, 不可重复读, 幻读
read committed 安全性低 会发生 不可重复读,幻读
repeatable 安全性中 只会发生幻读
serializable以上问题都不会发生 , 当然代价是效率低