MySQL 事务和索引

事务

事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

事务四大特性(简称ACID)

  • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
  • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障

要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务

数据库事务命令
  1. start transaction:开启事务
  2. rollback:回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚到上一次commit
  3. commit:提交事务,提交未存储的事务
  4. 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;
时间可以忽略不计

猜你喜欢

转载自blog.csdn.net/qq_14876133/article/details/82156218