MySql高级

视图

通俗的讲,视图就是一条sql语句执行后返回的结果集。

视图是对若干张表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表改变视图跟着变);分为单表视图(修改&查询)和多表视图(查询)。

作用

  1. 简化操作,特别是查询,减少复杂sql语句,增强可读性
  2. 安全性,用户只能查询和修改能看到的数据
  3. 逻辑上的独立性,屏蔽了真实表的结构带来的影响

缺点

1.性能差
如果建立视图的查询语句特别复杂,在视图中执行最简单的查询,数据库也会把它变成一个复杂结合体
2.修改限制
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

定义视图

视图命名已v_开头

--创建视图
create view 视图名 as select语句;
create view v_pro_cit as select p.*,c.city from provinces as p inner join cities as c on p.provinceid=c.provinceid having p.province='广东省';

--查看视图
    --会查询到所有视图和表
show tables;

--查看视图基本信息
show table status like 'v_pro_cit';

--使用视图
    --视图的用途就是查询
select * from v_pro_cit;

--删除视图
drop view v_pro_cit;

视图的修改

有以下内容之一,视图不能修改

  • select语句中包含distinct
  • select语句中包含组函数
  • select语句中包含group by子句
  • select语句中包含odrer by子句
  • where 子句中包含相关子查询
  • from 子表中包含多个表
  • 如果视图中有计算列,则不能更新
  • 如果基表中有某个非空约束的列未出现在视图中,则不能做insert插入。

事务

事务是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的单位。

  • 在mysql中只有innodb引擎支持事务
  • 事务处理可以用来维护数据库的完整性,保证多条sql语句要么全执行,要么全都不执行。
  • 事务用来管理insert update delete语句

事务的四大特性(ACID)

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔离性(isolation)
  • 持久性(durability)

原子性(atomictity)
一个事物必须被视为不可分割的最小单元,整个事务所有操作要么全部提交成功,要么全部失败回滚,对于一个事物来说不可能只执行其中一部分。

一致性(consistency)
数据库总是从一个一致的状态转到另一个一致的状态。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

隔离性(isolation)
数据库允许多个高并发实物同时对其数据进行读写和修改能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据不一致。

持久性(durability)
一单实物提交成功,则修改的数据会永久保存到数据库(此时系统崩溃,修改的数据也不会丢失)。

实物命令

  • 开启事务后执行修改命令,变更会维护到本地缓存中,而不维护物理表中。
  • 提交事务,将缓存中的数据变更维护到物理表中
  • 回滚事务,放弃缓存中变更的事务
--开启事务
begin;
or
start transaction;
--提交事务
commint;
--回滚事务
rollback;

事务广泛应用于订单系统,银行系统等多种场景
例如:

A用户和B用户是银行的储户,先A给B转500元,那么需要做已下几件事:

  1. A账户的余额大于500
  2. A账户扣除500元
  3. B账户增加500元

以上三件实物缺一不可,且不能再分解

--创建账户A
create table part_a(
    id tinyint primary key,
    name varchar(30),
    money int
);

--插入用户tony,余额500
insert into part_a value(1,'tony',500);

--创建账户B
create table part_b(
    id tinyint primary key,
    name varchar(30),
    money int
);

--插入用户shell,余额0
insert into part_b value(1,'shell',0);

--开启事务
start transaction;

--a用户扣除500
update part_a set money=money-500 where id=1;

--b用户增加500
update part_b set money=money+500 where id=1;

--提交
commit;

阻塞

如果part_a在开启事务的状态中且用户a扣除了500,此时如果有其他事务对其进行操作,会遇到阻塞,待前事务完毕后才会执行,或是等待时间太长,报错。

在这里插入图片描述

A

begin;
update part_a set money=money-600 where id=1;
update part_a set money=money+600 where id=3;
--先不提交,执行事务B
commit;

B

begin;
update part_a set money=money+100 where id=2;
--上面语句会执行
update part_a set money=money-100 where id=1;
--会阻塞,没有反应,50秒后会报错(默认50)
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
--提交事务A

在这里插入图片描述

从结果发现,事务B中第一条语句执行了,第二条没有,因为第二条中的id=1在事务A正在执行,这是事务的隔离性导致的。

索引

索引是一种特殊文件(InnoDB数据表上的索引是表空间的一个组成部分),它包含着对数据表里所有记录的引用指针。通俗的说,数据库的索引好比是目录,能加快数据库的查询速度。

索引的使用

  • 查看索引
show index from 表名;
  • 创建索引
    • 如果指定字段是字符串(char,varchar),需要指定长度,length可以小于实际长度,如果是BLOB/TEXT类型,必须指定length
    • 若字段类型不是字符串,可以不指定length
create index 索引名称(idx_) on 表名(字段名称(length));
  • 删除索引
drop index 索引名 on 表名;

索引案例

--创建测试版text
create table text1(
    id int primary key auto_increment,
    title varchar(10)
);

--用python向表中插入100000条数据,1-100000

--开启运行时间检测
set profiling=1;

--查询第1万条数据
select * from text1 where title=10000;

-- 为titile字段添加索引
create index idx_title on text1(title(10));

--查询第1万条数据
select * from text1 where title=10000;

--查看执行时间
show profiles;

在这里插入图片描述

组合索引

如果对一个表创建组合索引

create table mt(
    id int not null,
    name varchar(16) not null,
    location varchar(30) not null,
    higth decimal(5,2)
)

create index idx_n_l_h on mt(name(10),location(30),higth);

建立组合索引相当于分别建立下面组合

name,location,higth
name,location
name,higth

没有location,higth这样的组合,因为mysql组合索引“最左前缀”的结果

索引的缺点

  • 虽然索引提高了查询速度,但会降低增删改的速度
  • 如果一张表建立太多索引,会占用磁盘空间的索引文件,索引就好像是高铁,其他记录好比火车,都变成高铁了,何来速度优势?

适合建立索引的情况

  1. 主键自动创建索引
  2. 频繁作为查询条件的字段应该创建索引(注意索引不包含有null值得列,索引能建立,但无效)
  3. 查询中雨其他表关联的字段,外键关系建立索引
  4. 在高并发的情况下创建复合索引
  5. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度(创建索引的顺序跟排序的顺序保持一致)

不适合建立索引的情况

  1. 频繁变更的字段
  2. where条件里面用不到的字段
  3. 表记录太少,当表中数据量不足300百万时
  4. 数据重复且平均的表字段,如性别,国籍

索引的实现原理

只介绍一种,B+树,B+树的查询非常快,但插入,增加,删除代价很高
参考链接:https://blog.csdn.net/wade3015/article/details/90899343

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值