数据库事务和索引

事务

事务:是数据库中的最小执行单元是不可分割的,一个事务 中可以拥有1条或多条SQL语句,事务可以保证这些语句要么全部
执行要么全部不执行。如果是更新语句那么必须要执行事务的并且提交否则数据不会更新到磁盘。
事务的4特性
1.原子性(Atomicity) :事务是最小的执行单元不能分割
2.一致性(consistency) :事务中可以有1条或多条sel, 这些sqI要么全部执行要么全部不执行
3.隔离性(Isolation):事务和事务之间是相互隔离A事务不能帮助B事务提交
4.持久性(Durability):执行更新语句必须使用事务提交否则无法将数据写入磁盘,更新语句包括添加删除修改
注意:
1.MySQL的事务默认是自动提交的,也就是说一条语句就是-一个事务
2.comit提交事务 他会将内存中的数据序列化到磁盘中,完成数据的持久化操作,并接受当前的事务释放内存

3.rollback回滚事务 它会将内存中的所有数据(语句)放弃,并结束当前事务,释放内存

4.start transaction 开启一个手动的事务

事务的隔离级别
不同事务隔离级别的问题
1.脏读:有2个事务A和B ,A事务插入了- -条记录但是并没有提交事务,这时B事务执 行了- -条查询语句就查询到了,那条没有提交 这条数据就是脏数据。
2.不可重复读:有2个事务A和B,B事务执行了- -条查询语句,这时A事务执行了- -条修改语句(update) 并且提交了事务,
这时B事务再–次执行刚刚的那条查询语句,2次查询结果不–样这就是不可重复读
3.幻读:有2个事务A和B, B事务执行了一条查询语句,这时A事务执行了- -条插入语句(insert) 并且提交了事务,
这时B事务再一次执行刚刚的那条查询语句,2次查询结果不一样这就是幻读
4个事务的隔离级别
读未提交(READ UMCOMMITTED) : 可以读取到其他事务还没有提 交的额数据,肯能会出现脏读
读已提交(READCOMMITTED):只能读取到其他事务已经提交了的数据,可能会出现不可重复读或幻读
可重复读(REPEATABLEREAD)mysql默认:只能读取到其他事务已经提交的数据,可以避免不可重复的但有可能会出现幻读,但是在InnoDB存储引擎模式中,可以避免幻读
串行化(SERIALIZABLE) [序列化] :事务完全隔离,可以避免脏读幻读,不可重复的但是效率也是最低的

查看事务级别

会话级别的:select @@session.tx_isolation

全局级别的:select @@global.tx_isolation

设置事务级别

会话级别的:set session transaction isolation level read committed

全局级别的:set global transaction isolation level read committed

索引

索引类似图书中的目录,可以利用索引快速的查找到表的记录,索引需要额外的磁盘空间来存放,每次个更新数据时系统都会拿出额外的实现来更新索引,索引应该建立才重复率相对较低的列上最好是唯一列,索引应该建立在内容比较少的列上最好是数字列。索引的使用场景:数据量大,查询操作多。
注意:
1.索引应该建立在经常作为查询条件的列上,可以提高查询速度
2.不要在频繁修改的列上添加索引
3.索引不要建立特别的多
索引的创建语法
1、create [unique] index 索引名on表名(列名1,列名2…列名n) ;
2、alter table 表名add [unique] index 索引名(列名1,列名2…列名n)
注意:
1.unique是可选的添加以后表示当前列是唯–索引
2.可以同时为多个列建立索引,称为复合索引,建立好复合索引以后I只有这些列同时出现在where的后面索引才会起作用
不推荐使用
3.索引名字除在删除索引时有用外其他时候没有作用,但是不能重复

删除索引语法格式
1、DROP INDEX索引名ON表名.
2、ALTER TABLE表名e DROP INDEX 索引名

索引的使用
使用
explain查询语句
explain是sQL的执行计划,它可以帮我们分析出我们的sQL是否使用到了索引.
我们只需要关注sgL执行计划中的type列的值即可
type取值
all表示全文检索,它扫描的表中的所有然后再返回我们的查询结果,这个类型没有使用到索引
index表示索引全文检索,它扫描所有的索引然后再返回我们的查询结果,没有使用索引

除这2个中取值外其他的类型都使用到了索引

例如range表示某个范围内使用索引,只扫描了部分索引,where中会用> < >= <=这样的运算符以后如果现实列获取的是索引列或其他的索引列那么就会是范围的

ref表示精准的获取某个数据,它会直接到索引中去获取数据
注意:
1.主键、唯–约束、外键默认都是带有索引的因此他们的查询速度是非常快的

索引失效场景
1.where后面尽量不带 !=,>=,<= 等操作符
2.where字句后面不用or连接条件
3.对于多索引列,第一个必须要存在,否则索引会失效
4.如果列类型是字符,要加引号
5.like模糊查询不能以%开头
6.在索引列什么不要计算
7.不要在索引列上用is/not null

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值