MySQL高级 #视图 #事务 #索引 #账户管理

MySQL高级

  • 一、视图
    • 1)视图是什么
    • 2)视图的作用
    • 3)代码
    • 4)删除视图
    • 5)视图的好处
  • 二、事务
    • 1)事务是什么
    • 2)事务的四大特性ACID(背诵理解)
      • 1>四大特性
      • 1>四大特性详解
      • 3>举例说明
  • 三、索引
    • 1)程序执行的时间
    • 2)建立索引
    • 3)查看索引
    • 4)删除索引
    • 5)注意
  • 四、账户管理(需要时查文档即可)
    • 1)授予权限
      • 1>理解用户概念
      • 2>创建用户demo
      • 3>删除账号
      • 3>更多操作

这里高级应用的SQL语句,不需要背。当实际需要时,查询本教程或谷歌即可。

一、视图

1)视图是什么

  • 数据库表结构改变时,程序也要相应改动,这样的话,耦合度太高了。
  • 当我们写完一个程序时,它要在操作系统上使用。那是不是,Windows上要一个版本?然后Linux上要一个版本?理论上是的。但是有这样一个东西,它叫解释器,有Windows解释器也有Linux解释器。只要有这些解释器,在不同操作系统上,程序不用改动,就可以达到相同的功能。解释器去除了底层的区别。
  • 我们弄一个虚拟的表,从而无视底层的数据表变化。这个虚拟的表就叫视图。
    MySQL高级 #视图 #事务 #索引 #账户管理_第1张图片

2)视图的作用

  • 视图的作用就是隔离数据库:视图就是一条select语句执行后返回的结果集。是对若干张基本表的引用,是一张虚表,是查询语句执行的结果。
  • 视图是为了方便查询的,不是为了增删改的。
  • 虚拟表在调用时,才产生(相当于执行SQL语句)。所以它具有跟随基础表同步更新的特性。

3)代码

  1. 你需要一个select语句查询出来的结果集,比如:
    MySQL高级 #视图 #事务 #索引 #账户管理_第2张图片
  2. 创建视图

create view 视图名 as 结果集;

视图名以v_开头美观。
(创建视图代码)
在这里插入图片描述
(查看表,发现有个虚拟表)
MySQL高级 #视图 #事务 #索引 #账户管理_第3张图片
(直接查看虚拟表)
MySQL高级 #视图 #事务 #索引 #账户管理_第4张图片

4)删除视图

drop view 视图名;

5)视图的好处

  1. 提高了重用性,就像一个函数
  2. 对数据库重构,却不影响程序的运行
  3. 提高了安全性能,可以对不同的用户
  4. 让数据更加清晰

二、事务

1)事务是什么

  • 比如转账,不可以一个人扣了钱,另一个人没收到。这种要么同时执行,要么同时不执行,形成一个不可分割的工作单位。这,就是事务。
  • 事务是保证将来数据百分之百成功的一种方式。
  • 使用start transaction;开启一个事务。使用commit;提交一个事务。使用rollback;回滚一个事务。

2)事务的四大特性ACID(背诵理解)

1>四大特性

  1. 原子性A
  2. 一致性C
  3. 隔离性I
  4. 持久性D

比如买东西时。需要几个步骤:①检查账户余额是否充足 ②从本人账户扣款 ③从商家账户增款
上面三个操作必须打包在一个事务中,任何一个步骤失败,则必须回滚rollback;所有的步骤。

1>四大特性详解

原子性是指: 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能值执行其中的一部分操作,这就是事务的原子性
#(所有语句都成功,就commit。否则就rollback)

一致性是指: 数据库总是从一个一致性的状态,转向另一个一致性的状态。(比如某条失败,事务中所做的修改也不会保存在数据库中)(要么执行成功,要么不执行成功)

隔离性是指: 一个事务在最终提交之前,对其它事务是隔离的,不可见。(如下面,一个终端发生了事务,另一个终端也想对此行进行修改。哪个先commit,哪个就先修改。当然,后修改的会覆盖。)

持久性是指: 一旦事务提交,其所做的修改会永久保存到数据库。(即使系统崩溃,修改的数据也不会丢失。)

**总结一下:**原子性是要么成功,要么不成功。一致性是不会出现中间数据丢了的情况。隔离性是一个用户的操作,对其他用户不可见。

3>举例说明

  • python是默认开启事务的,所以需要commit提交。终端也是默认开启事务的,但它也默认提交。希望终端开启事务而不自动提交,就需要手动开启事务。用start transaction;或者begin;来开启一个事务,这样,只要用户不commit,它就不会提交。(在这个终端即使不提交,也可以预览到。但实际是没发生的。可以在没提交状态下,使用另一个终端查看。)

MySQL高级 #视图 #事务 #索引 #账户管理_第5张图片

这样看来,开启事务似乎没什么影响啊。我们保持这个终端不动,开启另一个终端。会发现,没有最后那一条数据。原因就是没有提交commit。
MySQL高级 #视图 #事务 #索引 #账户管理_第6张图片
接下来,和我做一样的操作:在原终端,不提交事务,而在新终端对原终端修改的这几条记录,进行修改,会发生什么?
MySQL高级 #视图 #事务 #索引 #账户管理_第7张图片

MySQL高级 #视图 #事务 #索引 #账户管理_第8张图片

最后一行的意思是,有锁,终端等待太久,请尝试重新启动事务。
只要旧终端一提交或是回滚,新终端紧接着就会开始执行。最后显示的内容,是新终端的内容。

三、索引

  • 索引是一种特殊的文件(innoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
  • 相当于一个文章的空间,留出一小部分来放置目录。

1)程序执行的时间

  • 要知道索引有多快,首先要知道怎样记录时间。
  • 拿出你的秒表终端:

--开启运行时间监测
set profiling=1;
--运行几条SQL语句
--查看执行的时间(会显示ID,时间,以及对应的SQL语句)
show profiles;
MySQL高级 #视图 #事务 #索引 #账户管理_第9张图片
单看,并不觉得快或是慢,下面建立索引,对比看看。

2)建立索引

create index 表名 on 表名(字段名);
例如: create index test on test(tital(15));
--解释一下,这里title是字符串类型的,且长度为15.整数类型就不用写括号。
依次执行下列语句:

  1. select * from test where title=“重要的事情说77777遍!”;
  2. create index test on test(title(15));
  3. select * from test where title=“重要的事情说77777遍!”;
    MySQL高级 #视图 #事务 #索引 #账户管理_第10张图片
    红框为没有索引时的时间,蓝框为建立索引后的时间。十万条数据下,快了两个数量级。数据更多时,差距更大。
  • 索引的字段就相当于字典里的笔画拼音等,是一个依据,只有根据它查找时,才会更快。如果有多个字段,根据其它字段查找,并不会变快。
  • 索引通过不断地缩小想要获得数据的范围来筛选出最终想要的结果。相当于一个树。下面是一个B+树。

MySQL高级 #视图 #事务 #索引 #账户管理_第11张图片

3)查看索引

在这里插入图片描述

  • keyname表示索引的表,colum_name表示索引的字段。
    在这里插入图片描述
  • 上图是什么? 我们查询了一个没有添加过索引的表的索引。发现有三个索引。原来是生成主键和外键时,自动生成了索引。

4)删除索引

drop index 索引名 on 表名;

5)注意

  • 建立太多的索引将会影响更新和插入的书读。因为它同样需要更新每个索引文件。如果更新修改的频率大,查询频率小,就没有必要建立索引了。比较小的表,也没有必要建立索引。
  • 索引要占用磁盘空间。

四、账户管理(需要时查文档即可)

1)授予权限

1>理解用户概念

--使用mysql数据库。(数据库信息存在这个数据库里。)

  1. use mysql;
  2. show tables;
    MySQL高级 #视图 #事务 #索引 #账户管理_第12张图片
    -- 可以看到有许多张表。user表里存着root用户信息。接下来查看user的字段。
  3. desc user;
    MySQL高级 #视图 #事务 #索引 #账户管理_第13张图片
    --可以看到有许多的字段。
  4. select user,host from user;
    MySQL高级 #视图 #事务 #索引 #账户管理_第14张图片
    左边一列,表示可以登录mysql的用户。右边表示可以通过哪个地方登录, % 表示任意一台电脑登录,localhost表示只能本地登录。
    --查看密码(加密过的密码)
  5. select host,user,authentication_string from user;
    MySQL高级 #视图 #事务 #索引 #账户管理_第15张图片

2>创建用户demo

创建用户: create user ‘用户名’@‘访问主机’ identified by ‘密码’;
给与权限: grant 权限列表 on 数据库 to ‘用户名’@‘访问主机’;
MySQL高级 #视图 #事务 #索引 #账户管理_第16张图片
--创建的前提是以root管理员登录
create user ‘tom’@‘localhost’ identified by ‘123456’;
grant select on shop.* to ‘tom’@‘localhost’;
MySQL高级 #视图 #事务 #索引 #账户管理_第17张图片

3>删除账号

drop user ‘名’@‘密’;

3>更多操作

官方对创建用户的签名
官方对Grant的说明
不要用远程登录。只要注释了IP,就给了别人可乘之机。IP和端口可以用扫描仪,账户一般都有一个‘root‘,密码暴力破解。数据库的大门自向别人打开。

你可能感兴趣的:(数据库,#,MySQL)