事务
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
事务四大特性(简称ACID)
- 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
- 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
- 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
- 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
数据库事务命令
- start transaction:开启事务
- rollback:回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚到上一次commit
- commit:提交事务,提交未存储的事务
- savepoint:设置保留点 ,事务处理中设置的临时占位符,你可以对它发布回退(与整个事务回退不同)
-- 创建数据表并插入数据
create table person(
id int primary key auto_increment,
name varchar(20),
price int
);
insert into person(name,price) values('Tom',100),('Jake',120),('Mike',140);
-- 开启事务
start transaction;
-- 操作数据表
update person set price=price+100 where name='Tom';
-- 提交事务
commit;
-- 保留点
start transaction;
update person set price=price+100 where name='Tom';
savepoint price100;
update person set price=price+10000 where name='Tom';
savepoint price10000;
-- 回滚到指定保留点
rollback to price100;
commit;
mysql> select * from person;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | Tom | 200 |
| 2 | Jake | 120 |
| 3 | Mike | 140 |
+----+------+-------+
索引
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构
索引能提高数据访问性能
主键和唯一索引,都是索引,可以提高查询速度
- 索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高
-- 创建普通索引
create table tab1(
id int,
name varchar(30),
index index_tab1_name (name)
);
-- 创建唯一索引
create table tab2(
id int,
name varchar(30),
unique index index_tab2_name(name)
);
-- 创建全文索引
create table tab3(
id int,
name varchar(30),
fulltext index index_tab3_name (name)
);
-- 创建多列索引
create table tab4(
id int,
name varchar(30),
resume varchar(30),
index index_name_desc (name,resume)
);
-- 添加索引
create index index_tab_name on tab(name);
alter table tab add index index_tab_name(name);
-- 删除索引
drop index index_tab_name on tab;
索引性能测试
-- 创建表
create table person(
id int,
name varchar(20)
);
-- 插入多条数据
-- 使用存储过程
delimiter //
create procedure insertdata()
BEGIN
declare i int default 1;
while(i<500000) do
insert into person values(i,'test');
set i=i+1;
end while;
END//
-- 调用函数
delimiter ;
call insertdata();
-- 创建索引前
select * from person where id=4000
时间: 0.629s
-- 使用索引查找
create index index_id on person(id);
select * from person where id=4000;
时间可以忽略不计