数据库索引
索引的概念
为了快速查找,在频繁使用的过滤字段添加一个二分查找树,一般称为B树,但mysql用的是B+树
创建索引(B + 树索引)
--查询时用索引字段过滤时,会使用到索引
-- 为了在频繁使用的过滤字段添加一个二分查找树,
-- 一般称为B树,在mysql用的是B + 树。
create index aaa on emp(ename);
select * from emp where ename = 'SMITH';
视图
在单表中创建视图
视图本身不存数据,他只是存查询的东西。 以后在别人想要查询表中信息时, 就不用再将表中对象的各个参数名列出来了。
create view vemp as select empno,ename,job,mgr,sal,comm from emp where sal > 2000;
select * from vemp;
数据库操作:事务
如:银行转帐1000,是两个更新操作,1.把自己帐号的存款金额改为减少1000,2.把对方存款改为增加1000
事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务的ACID特性:
-
原子性(atomicity)
-
一致性(consistency)
-
隔离性(isolation)
-
持久性(durability)
事务的并发性是指多个事务的并行操作轮流交叉运行,事务的并发可能会访问和存储不正确的数据,破坏交易的隔离性和数据库的一致性。
-- 创建事务
create table Account (
id int primary key,
account int,
acciont_name varchar (50)
);
-- 插入事务对象
insert into Account (id, account, acciont_name)
value
(1, 5000, '张三');
insert into Account (id, account, acciont_name)
value
(2, 5000, '李四');
--查询
select * from Account;
第一种开启事务的方式 显式声明
rollback:回滚,事务的中间状态, 作用是使事务回到事务开启之前的状态,且不让其他人看到的性质为,隔离性。 且每次执行回滚后,如果不begin就无法再开启事务。 即这是一整套操作,必须从头开始。
commit:事务提交,将回滚段的数据直接更新到数据段。
begin; -- 开启事务
update Account set account=account - 1000 where id=1; --更新一个帐号
update Account set account=account + 1000 where id=2; -- 更新另一个帐号
rollback; -- 回滚 回复到开启事务前的状态
commit; -- 提交 只有执行提交,前面的操作才真正存在数据库中
select * from Account;
第二种开启事务的方式 隐式声明
事实上数据库每执行一条添、删、改的操作时,没开启事务的话,是默认提交的。 设置自动提交为0,就是默认开启事务,不自动提交。 为1默认自动提交。
注意,如果上面设置为不自动提交,那么事务是不会被更新到数据段的。 到我们去查询数据时,我们看到的仍然是之前回滚段上面的数据。
set autocommit = 0;
update Account set account = account - 1000 where id = 1;
update Account set account = account + 1000 where id = 2;
rollback;
select * from Account;
设置回滚段保存点
当数据较大时,我们就需要设置保存点,一般为1万个数据为单位。
当我们回滚到相应的保存点上时,我们刷新所看到数据就是该保存点之前的回滚数据数据。
set autocommit= 0;
update Account set account=account - 1000 where id=1;
update Account set account=account + 1000 where id=2;
savepoint aa;
update Account set account=account - 1000 where id=1;
update Account set account=account + 1000 where id=2;
savepoint bb;
update Account set account=account - 1000 where id=1;
update Account set account=account + 1000 where id=2;
rollback to aa;--回滚到aa事务保存点
rollback to bb;--回滚到bb事务保存点
rollback;--回滚
commit;
select * from Account;
事务的隔离级别
1、事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
2、隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
我们可以用下列语句查询当前数据库的事务隔离级别
select @@tx_isolation;
--如果需要,可以用下面语句设置数据库的隔离级别
set session transaction isolation level read committed;
select @@tx_isolation;