一、事务
1.什么是事务
事务是由一组DML语句组成,完成一个相对完整的功能,这一组DML语句要么全部执行,要么全部放弃执行。
例如,赵四给刘能转账,这对于数据库而言就是一个事务。该事务由两部分单独的操作组成,赵四账户减少钱,刘能账户增加钱,作为数据库,必须保证组成事务的两部分操作必须全部完成,才能维护数据的一致性。当因为某种原因,导致其中的一个操作失败,那么其他的操作也会被撤销。
2.数据库开启事务命令
2.1 start transaction 或者 begin 开启事务
savepoint 保留点 ,事务处理中设置的临时占位符 你可以对它发布回退。
例1:zs 给 lisi 转账 100块钱。
start TRANSACTION;
update account set money=money-100 where name =‘zs’;
update account set money = money+100 where name = ‘ls’;
COMMIT;
2.2 commit 提交事务,提交未存储的事务
例2:zs 给lisi 转账100块钱,中间出差。
start TRANSACTION;
update account set money=money-100 where name =‘zs’;
– 错误语句
insert into account(id,name,money) values(3,‘ww’,1000,333);
update account set money = money+100 where name = ‘ls’;
COMMIT;
select * from account;
2.3 rollback 回滚事务,即撤销指定的sql语句(回退insert delete update语句)
例3:向t5表格中添加两条数据,然后再回滚到原始值。
create table t5(id int PRIMARY key auto_increment,name varchar(20),gender varchar(20));
insert into t5(name,gender) values(‘zs’,‘man’);
insert into t5(name,gender) values(‘ls’,‘man’);
insert into t5(name,gender) values(‘ww’,‘man’);
insert into t5(name,gender) values(‘zq’,‘man’);
start TRANSACTION;
insert into t5(name,gender) values(‘张飞’,‘man’);
insert into t5(name,gender) values(‘关羽’,‘man’);
select * from t5;
ROLLBACK;
select * from t5;
执行第一条select * from t5;的时候,插入了六条数据,回滚后,显示前四条数据,后两条回滚后删除。
注意:默认回滚到开启事务位置。
例4:设置回滚点。
start TRANSACTION;
insert into t5(name,gender) values(‘张飞’,‘man’);
SAVEPOINT s1;
insert into t5(name,gender) values(‘关羽’,‘man’);
SAVEPOINT s2;
insert into t5(name,gender) values(‘刘备’,‘man’);
SAVEPOINT s3;
insert into t5(name,gender) values(‘赵云’,‘man’);
select * from t5;
ROLLBACK to s2;
select * from t5;
3.事物的特性
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。
(1)原子性:是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。就如原子是自然界最小颗粒,具有不可再分的特征一样。
(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(双方账户的总和不能少也不能多)
(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。(简单的理解 就是你做你的,我做我的!)
(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(转账记录成功了,不能过一会变成了出错了)
二、索引
索引在Mysql中是存储引擎用于快速找到记录的一种数据结构(BTree,平衡树),索引对于数据库的良好性能是非常关键的,尤其是当表中的数据量越来越大的时候,索引对于性能的影响愈发重要。
索引相当于字典的目录,如果查找某个字的时候可以通过目录,提高查询速度,否则需要翻阅字典的每一页。
使用索引的目的:提高查询速度。
索引特点:创建和维护索引会消耗很多时间与磁盘空间,但是查询速度大大提高。
(创建字典目录需要时间,字典目录需要占字典大小)
1.语法
语法1:创建表时,添加索引。
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
…,
Index | key [索引名称] (字段名)
);
语法2:创建完表后,添加索引。
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
…,
);
Alter table 表名 add {unique | primay key| index…索引种类} 索引名(字段名)
2.索引分类
(1)普通索引 就是一个普通的索引,可以为空,可以重复。
ALTER TABLE teacher ADD INDEX name_index(column);
(2)、唯一索引 可以为空,不可以重复。
ALTER TABLE teacher ADD UNIQUE(column); # 添加唯一索引
ALTER TABLE teacher ADD column type UNIQUE; # 添加列并且添加索引。
(3)、主键索引 不可以为空,不可以重复。
ALTER TABLE teacher ADD PRIMARY KEY(column);
只要是主键,就是索引。
(4)、多列索引。
ALTER TABLE teacher ADD INDEX(column1,column2,column3);
3.删除索引
Drop index 索引名 on 表名;
4.使用索引
1、少量数据不使用数据
2、查询次数少不使用索引
3、查询要携带索引字段,通常放在select之后第一个
4、索引提高了查询的效率,占有跟多的资源。
注意:索引不是越多越好。