事务约束索引等

事务

什么是事务

数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行.
简单的说:事务就是将一堆SQL语句(通常是增删改操作),要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态.

事务4个特性:ACID

一般来说,事务必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability).
原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中如果发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样.
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏.这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度/串联性以及后续数据库可以自发性地完成预定的工作.
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致.
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失.

隔离级别

事务隔离分为不同级别,包括:
读未提交:安全性最差,可能发生并发数据问题,性能最好.
读已提交:Oracle默认的隔离级别
可重复读:MySQL默认的隔离级别,安全性较好,性能一般.
串行化:表级锁,读写都加锁,效率低下,安全性高,不能并发.

mysql中的事务自管理

在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务.如果需要在一个事务中包含多条SQL语句,那么需要手动开启事务和结束事务.
开启事务:start transaction
结束事务:commit(提交事务)或rollback(回滚事务)
在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所做出的影响会持久化到数据库中.或者rollback,表示回滚,即回滚到事务的起点,之前做的所有操作都被撤销了.
查询mysql的隔离级别
select @@tx_isolation;
Repeatable Read(可重读)
MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行.

事务处理

  • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
  • 事务处理可以用来维护数据的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
  • 事务用来管理insert、update、delete语句,因为这些操作才会"破坏"数据,查询select语句是不会的
  • MySQL默认数据库的事务是开启的,执行SQL后自动提交.
  • MySQL的事务也可以改成手动提交,那就有两个步骤:先开启,写完SQL后,再手动提交.

表强化:6约束 constraints

非空约束 not null

唯一约束 unique

主键约束 primary key

主键是一条记录的唯一标识,具有唯一性,不能重复.
CREATE TABLE tb_user(
id INT,
NAME VARCHAR(30),
PRIMARY KEY (id)
);

外键约束 foreign key

DROP TABLE IF EXISTS tb_user_address; #如果表存在则删除,慎用会丢失数据
 
DROP TABLE IF EXISTS tb_user; #如果表存在则删除,慎用会丢失数据
 
CREATE TABLE tb_user (
 
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, #自增主键
 
NAME VARCHAR(50) NOT NULL UNIQUE, #非空,唯一索引
 
sex CHAR(2) DEFAULT '男', #默认值
 
phone CHAR(18),
 
age INT,
 
CHECK (age>0 AND age<=200),
 
);
 
CREATE TABLE tb_user_address (
 
user_id INT PRIMARY KEY NOT NULL,
 
address VARCHAR(200),
 
foreign key(user_id) REFERENCES tb_user(id)
 
);
 
DESC tb_user;
 
tb_user_address中user_id字段录入tb_user表不存在的主键值,将报错

默认约束 default

默认值

检查约束 check

很少使用,了解即可

SQL的执行顺序

(1) FROM [left_table] 选择表
 
(2) ON <join_condition> 链接条件
 
(3) <join_type> JOIN <right_table> 链接
 
(4) WHERE <where_condition> 条件过滤
 
(5) GROUP BY <group_by_list> 分组
 
(6) AGG_FUNC(column or expression),... 聚合
 
(7) HAVING <having_condition> 分组过滤
 
(8) SELECT (9) DISTINCT column,... 选择字段、去重
 
(9) ORDER BY <order_by_list> 排序
 
(10) LIMIT count OFFSET count; 分页

索引 index

定义

索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索.在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法.这种数据结构就叫做索引.
一般来说索引本身也很大,不可能全部存储在内存中,因此往往以索引文件的形式存放在磁盘中.目前大多数索引都采用BTree树方式构建.

分类

  • 单值索引:一个索引只包括一个列,一个表可以有多个列
  • 唯一索引:索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引
  • 复合索引:一个索引同时包括多列

创建索引

#查看索引,主键会自动创建索引
show index from dept;
#创建普通索引
create index 索引名字 on 表名(字段名);
#创建唯一索引
创建唯一索引 – 索引值必须唯一
create unique index 索引名 on 表名(字段名)
#创建复合索引
如果你希望那个索引不止一个列,你可以在括号中列出这些列的名称,用逗号隔开.
create index 索引名 表名 (字段1,字段2).
#删除索引
alter table dept drop index fuhe_index;’
#语句执行计划(查看是否用索引时用)关键字
explain
select * from dept where loc=‘二区’ #使用了loc索引

最左特性

当我们创建一个联合索引(复合索引)的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则,也称最左特性.
简单来说必须带着最左边那个字段 一起查的时候才能用这个索引,原理应该是寻找索引是否存在时只检查代号为1的索引.

索引扫描类型

type:

  • ALL 全表扫描,没有优化,最慢的方式
  • index 索引全扫描,其次慢的方式
  • range 索引范围扫描,常用语<,<=,>=,between等操作
  • ref使用非唯一索引或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
  • eq_ref类似ref,区别在于使用的是唯一索引,使用主键的关联查询
  • const/system单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询,system是cons的特殊情况.
  • null MySQL不访问任何表或索引,直接返回结果.

为何索引快

明显查询索引表比直接查询数据表要快得多,首先,索引表是排序了,可以类似二分查找,非常有效的提高了查询的速度.
起过程:先到事先排序好的索引表中检索查询,找到其主键后,就直接定位到记录所在的位置,然后直接返回这条数据.

  • 排序,tree结构,类似二分查找
  • 索引表小

小结

优点

  • 索引是数据库优化
  • 表的主键会默认自动创建索引
  • 每个字段都可以被索引
  • 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
  • 索引事先对数据进行了排序,大大提高了查询效率

缺点

  • 索引本身也是一张表,该表保存了主键于索引字段,并指向实体表的记录,所以索引列也要占用空间.
  • 索引表中的内容,在业务表中都有,数据是重复的,空间是"浪费的"
  • 虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件.
  • 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引.

视图View

概念

可视化的表,视图当做是一个特殊的表,是指把sql执行的结果直接缓存到了视图中.
下次还要发起相同的sql,直接查看视图.
使用:1.创建视图2.使用视图

测试

create view 视图名 as  SQL语句;
select * from 视图名;
#视图:就是一个特殊的表,缓存上次的查询结果
#好处:提高了SQL的复用率,视图可以被共享,视图屏蔽了真实业务的复杂性
#坏处:是占内存无法被优化
 
#1.创建视图
CREATE VIEW emp_view AS
SELECT * FROM emp WHERE ename LIKE '%a%' #模糊查询,名字里包含a的
#2.使用视图
SELECT * FROM emp_view
 

表关联 association

多表联查

笛卡尔积 Cartesian product

三种连接 join

  • 内连接 inner join
  • 左(外)连接 left join
  • 右(外)连接 right join
    在这里插入图片描述
  • inner join两边都对应有记录的才展示,其他去掉
  • left join左边表中的数据都出现,右边没有数据以NULL填充
  • right join右边表中的数据都出现,左边没有数据以NULL填充

子查询 subquery

概念

子查询是指嵌入在其他select语句中的select语句,也叫做嵌套查询.子查询执行效率低慎用.记录少时效率影响不大时图方便直接使用,记录多时最好使用其它方式替代.
单行子查询 =
多行子查询 in

おすすめ

転載: blog.csdn.net/weixin_43770110/article/details/120530040