Linux || 数据库事务 视图 索引
文章目录
- 事务
- 什么是事务
- 事务四大特性 ACID
- 隔离级别
- 事务命令
- 视图
- 定义视图
- 使用视图
- 更新视图
- 索引
- 定义
- 创建索引
- 联合索引(复合索引)
- 最左原则
- 聚簇索引
- innoDB表的聚簇索引
- 非聚簇索引(辅助索引)
- 聚簇索引与非聚簇索引
- 使用原则
事务
什么是事务
- 事务:是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位,是一组原子性的SQL查询
为什么需要事务?
从银行转账问题引入,从一个账号扣款并使另一个账号入账,这两个操作要么都执行,要么都不执行,所以,应该把它们看做一个事务
事务四大特性 ACID
原子性(atomicity) | 一个不可分割的单位,只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功 |
一致性(consistency) | 不能处于一个中间状态 |
隔离性(isolation) | 一个事务所做的修改在最终提交之前,对其他事务是不可见的 |
持久性(durability) | 一旦提交事务,则所做的修改会永久保存到数据库中 |
隔离级别
READ UNCOMMITTED(未提交读)
事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,被称为脏读READ COMMITTED(提交读)
大多数数据库系统的默认隔离级别都是READ COMMITTED(但MySQL不是)
一个事务从开始到提交之前,所做的任何修改对其他事务都是不可见的REPEATABLE READ(可重复读)
1>解决脏读的问题;无法解决幻读的问题
2>保证在同一个事务中多次读取同样记录的结果是一致的;(即使别人写了数据 我们也观察不到,查看到的还是之前的)
3>MySQL的默认隔离级别;
注:在一次事务未提交前(没有commit;);其他事务是不能查看到该事务所做的改变,只有提交之后才可以看见。
幻读:指的是当前事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(数据库中有 但我们没有看到)。
- SERIALIZABLE(可串行化)
1>最高隔离级别;
2>避免了幻读问题;
3>在读取的每一行数据上加锁
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITTED | yes | yes | yes | no |
READ COMMITTED | no | yes | yes | no |
REPEATABLE READ | no | no | yes | no |
SERIALIZABLE | no | no | no | yes |
//查看系统隔离级别:
select @@global.transaction_isolation;//查看当前会话的隔离级别:
select @@session.transaction_isolation;//修改当前会话隔离级别
set session transaction isolation level READ COMMITTED;
事务命令
事务(transaction):一组SQL语句
回退(rollback):撤销指定SQL语句的过程
提交(commit ):指将未存储的SQL语句结果写入数据库表
保留点(savepoint):事务处理中设置的临时占位符,每个保留点都有标识自己的唯一名字,方便在回退时,MySQL明确自己要回退到何处(越多越好)。保留点会在事务处理完成(commit、rollback)后自动释放,或者使用release savepoint 明确释放保留点
可以回退的语句:insert、update、delete
不能回退的语句:select、create、drop
- 每一条语句都是一个事务,是直接针对数据库表执行和编写的,提交和保存操作是自动进行的。
- 但在事务处理模块中,提交就必须使用commit语句。如果使用了begin;则在未输入commit;之前的所有语句都属于一个事务
//查看表的引擎类型:(innodb类型才可以使用事务)//
show create table student;
begin; 或 start transaction;//开始事务
commit;//提交事务
//begin开始后 直到commit;提交才算一次事务
rollback; //回滚 回滚到begin之前的状态SAVEPOINT delete1;//创建保留点,部分回退时,可以回退到保留点处
rollback to delete1;
视图
- 视图并不在数据库中实际存放数据,它的数据来自定义视图时使用的基本表,并且是在使用视图时动态生成的
- 视图仅仅是用来查看存储在别处的数据的一种设施,本身不包含数据,在对其他表做出添加或删除操作时,视图将返回改变后的数据
- 视图提供了一种MySQL的select语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。
- 视图应用
1.重用SQL语句
2.使用表的组成部分而不是整个表
3.保护数据。可以给用户授予标的特定部分的访问权限而不是整个表的访问权限
4.更改数据格式和表示
定义视图
create view 视图名 as select 语句;
create view stuinfo as select name,clau,oslau,addr from student,score where student.id = score.id;
使用视图
show tables; 默认会显示表和视图,但不能区分。
show full tables; 会显示表和视图的类型
show create view viewname; 查看创建视图的语句
drop view viewname; 删除视图
create or replace view;(更新视图存在,会替换原有视图;更新视图不存在,会创建一个视图) 或先drop再用create
create view stuview as select STU.name,STU.age, stu.id from STU, stu where STU.name = stu.name;
更新视图
- 更新一个视图即更新其基本表,对试图进行增加或删除行,实际上是对其基表增加或删除行
- 并非所有视图都能更新,MySQL不能正确的确定被更新的基数据,则不允许更新
有以下操作则不可以进行视图更新:
- 分组(group by 和having)
- 联结
- 子查询:
- 并
- 聚集函数(Min(),Count(),Sum())
- DISTINCT(去重)
- 计算列
索引
定义
- 是一种特殊的文件,包含着对数据表所有记录的引用指针; 确定那些行符合where子句的条件,并检索到这些行其他列值的数据结构, 例如输的目录 能加快查询速度
- 索引本身很大,不能够全部存储在内存中,所以索引是存储在磁盘的文件上
- 普通索引、唯一索引、主键索引、外键索引、全文索引、复合索引
优势:
1.提高数据检索的效率,降低数据库的IO成本(目录)
2.通过索引列进行排序,降低CPU的消耗
劣势:
1.占用磁盘空间
2.会降低更新表的效率,对表进行增删查改,不仅要保存数据,还要保存或更新对应的索引文件
创建索引
- 主键列会自动创建索引
show index from 表名;//查看表中已有索引
- 索引的创建
- 不指定索引名,则默认使用字段名
alter table 表名 add index 索引名(列名,..);//创建索引
alter table stu add index my_name(name);
- 删除索引
alter table 表名 drop index 索引名;//删除索引
show create table stu; //
alter table stu drop index my_name;
联合索引(复合索引)
- 一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询。
- 好处:减少磁盘的空间开销(每创建一个索引就是创建一个索引文件,增加磁盘开销)
alter table stu add index (name,age);
最左原则
最左原则
1.联合索引在使用时遵循最左原则,即index(name,age)支持name;name和age;组合查询,而不支持age的单独查询
2.试用联合索引查询数据时要保证联合索引的最左侧字段出现在查询条件中,否则联合索引失效
select * from stu where name='张三' ;//这⾥使⽤了联合索引的name部分
select * from stu where name='李四' and age=10 ;// 这⾥完整的使⽤联合索引,包括 name 和 age 部分
select * from stu where age=10;//没有使⽤到联合索引 因为联合索引⾥⾯没有这个组合,只有 name | name age 这两种组合
聚簇索引
- 概念
聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页
- 聚簇索引不是一种单独的索引类型,而是一种数据存储方式
- 一旦创建了聚簇索引,表中所有列都根据构造聚簇索引的关键列来存储,所以一个表中只能有一个聚簇索引
- 主键索引是一种聚簇索引
- 底层结构:
B+树
innoDB表的聚簇索引
每个InnoDB表都需要一个聚簇索引。该聚簇索引可以帮助表优化增删改查操作。
如果你为表定义了一个主键,MySQL将使用主键作为聚簇索引。
如果你不为表指定一个主键,MySQL讲索第一个组成列都not null的唯一索引作为聚簇索引。
如果InnoBD表没有主键且没有适合的唯一索引(没有构成该唯一索引的所有列都NOT NULL),MySQL将自动创建一个隐藏的名字为“GEN_CLUST_INDEX ”的聚簇索引。
因此每个InnoDB表都有且仅有一个聚簇索引。
非聚簇索引(辅助索引)
所有不是聚簇索引的索引都叫非聚簇索引或辅助索引
复合索引、前缀索引、唯一索引
聚簇索引与非聚簇索引
聚簇索引是将数据与索引存储到一起,找到索引也就找到了数据;而非聚簇索引是将数据和索引存储分离开,索引树的叶子节点存储了数据行的地址。
在InnoDB中,一个表有且仅有一个聚簇索引(因为原始数据只留一份,而数据和聚簇索引在一起),并且该索引是建立在主键上的,即使没有指定主键,也会特殊处理生成一个聚簇索引;其他索引都是辅助索引,使用辅助索引访问索引外的其他字段时都需要进行二次查找。
在InnoDB存储引擎中,可以将B+树索引分为聚簇索引和辅助索引(非聚簇索引)。无论是何种索引,每个页的大小都为16KB,且不能更改。 聚簇索引是根据主键创建的一棵B+树,聚簇索引的叶子节点存放了表中的所有记录。**辅助索引是根据索引键创建的一棵B+树,**与聚簇索引不同的是,其叶子节点仅存放索引键值,以及该索引键值指向的主键。也就是说,如果通过辅助索引来查找数据,那么当找到辅助索引的叶子节点后,很有可能还需要根据主键值查找聚簇索引来得到数据,这种查找方式又被称为书签查找。因为辅助索引不包含行记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般都要小于聚簇索引。
使用原则
1.索引不是越多越好
2.对经常更新的表避免创建过多的索引,对经常用于查询的字段应该创建索引
3.数据量少的表尽量不要创建索引,数据较少可能查询全部数据花费的时间比遍历索引的时间短
4.在一字段上相同值较多不要创建索引
只要创建了索引就一定会走索引吗
不一定,在使用组合索引的时候,如果没有遵从“最左前缀”的原则进行搜索,则索引是不起作用的。 举例,假设在id、name、age字段上已经成功建立了一个名为MultiIdx的组合索引。索引行中按id、name、age的顺序存放,索引可以搜索id、(id,name)、(id, name, age)字段组合。如果列不构成索引最左面的前缀,那么MySQL不能使用局部索引,如(age)或者(name,age)组合则不能使用该索引查询。
Linux || 数据库事务 视图 索引相关推荐
- mysql如何进行视图恢复_mysql事务 视图 索引 备份和恢复
事务 1.事务: 概念:是作为单个逻辑工作单元执行的一系列操作 多个操作作为一个整体向系统提交,要么都执行,要么都不执行 事务是一个不可分割的工作逻辑单元 默认情况下 , 每条单独的SQL语句视为一个 ...
- MySQL数据库——事务和索引
目录 一.事务: 事务四大特性: 并发事务带来哪些问题?(隔离所导致的一些问题) 事务隔离级别有哪些? MySQL的默认隔离级别: 二.索引: 索引的作用: 索引的分类: 索引准则: 索引的数据结构: ...
- 数据库 模式 视图 索引
1.外模式.模式.内模式之间的区别及其映射关系 从数据库管理系统角度看,数据库系统通常采用三级模式结构:外模式.模式.内模式,这是数据库管理系统内部的系统结构.在数据模型中有"型" ...
- MySQL数据库(四):多表查询、视图、事务、索引、函数、Go连接MySQL
MySQL数据库:视图.事务.索引.函数.Go连接MySQL 1.1 目录 文章目录 1.1 目录 1.2 多表查询分类 1.2.1 内连接[inner join] 1.2.2 左外连接[left j ...
- MySQL数据库介绍——包含索引、视图、事务、引擎
文章目录 什么是数据库 数据库安装 索引 视图 事务 MySQL数据库优化方式 引擎 什么是数据库 平时我们大家看到的各种网站.网页,其实里面最底层的内容基本上都来自于数据库.首先我们看到的Web页面 ...
- 学习事务,视图和索引
1.事务 什么是事务? 事务是作为单个逻辑工作单元执行的一系列操作. 事务有四种属性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),及持久性(Durab ...
- mysql 表 视图 索引吗_Mysql多表查询, 视图,事务,索引,函数,go连接数据库
1.1 今日目标 理解多表查询 理解子查询 能够创建视图 能够删除视图 能够查看创建视图的SQL语句 能够理解事务的作用 能够操作事务 理解索引的作用 能够创建索引 能够删除索引 知道常用的函数 了解 ...
- rds mysql 视图 索引_数据库 视图 索引
SQL2K数据库开发二十二之索引操作在视图上创建索引 1.在企业管理器中,右击要创建索引的视图,在弹出的菜单中选择"设计视图"命令进入视图设计器. 2.在视图设计器中显示了视图所包 ...
- SQL server学习(四)T-SQL编程之事务、索引和视图
今天来分享下T-SQL高级编程中的事务.索引.视图,可以和之前的SQL server系列文章结合起来. 一.事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个 ...
最新文章
- TIOBE 1 月编程语言:Python 摘得 2020 年度编程语言!
- Fedora26 tftp-server设置
- bootstrap34-带有导航栏的字体图标
- 从C语言的角度重构数据结构系列(八)-数据结构堆知识超级丑数
- 深圳6月23号活动《产品经理三分钟》报名开始啦!
- hdu 1429 胜利大逃亡(续) bfs+状态压缩
- [文摘20090203]手机基本知识
- (77)FPGA时序违例及解决办法-面试必问(一)(第16天)
- 大数据城市规划 杨东_空头转多!前期大比例减仓的私募,目前开始加仓
- 谈谈YOLOv2做了哪些改进
- java 中的通讯之HTTP协议
- 男朋友就是要这个样子的
- php怎么异步执行,php怎么实现异步
- xgboost模型训练出来的错误Error during wrapup: NA/NaN argument
- POJ 2248 Addition Chains
- 空气颗粒度PM2.5的检测设计与实现
- 一个大一程序员的反思
- 动态规划算法练习:蓝桥杯,洛谷的传纸条游戏的三种解法
- [洛谷]P1234 小A的口头禅 (#模拟)
- 通过新外设CLB猜测TI C2000的发展方向