数据库优化第7讲 - MySQL高级-视图&事务&索引&存储引擎介绍

一、视图

视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

1.定义视图

create view 视图名称 as select语句;

2.查看视图:查看表会将所有的视图也列出来

show tables;

3.使用视图:视图的用途就是查询

select * from v_stu_score;

4.删除视图:drop view 视图名称;

drop view v_stu_sco;

5.视图案例

select p.id,p.`province`,c.`city` from provinces as p inner join cities as c on p.`provinceid` = c.provinceid having p.`province` = '黑龙江省';

8.视图的修改
有下列内容之一,视图不能做修改

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

视图的作用

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

二、事务

事务四大特性(简称ACID)

原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)

2.1 原子性:

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

2.2 一致性:

数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)

2.3 隔离性:

通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)

2.4 持久性:

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

2.5 事务的命令

表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎

  • 开启事务:

     begin;
     或者
     start transaction;
    
  • 提交事务:将缓存中的数据变更维护到物理表中

     commit;
    
  • 回滚事务:放弃缓存中变更的数据

     rollback;
    

注意:

修改数据的命令会自动的触发事务,包括insert、update、delete
而在SQL语句中有手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起会滚到之前的数据

三、索引

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

3.1 查看索引

show index from 表名;

3.2 创建索引

如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分

	create index 索引名称 on 表名(字段名称(长度))

3.3 删除索引:

drop index 索引名称 on 表名;

3.4 开启运行时间监测:

set profiling=1;

3.5 查看执行的时间:

show profiles;

适合建立索引的情况

1.主键自动建立索引

2.频繁作为查询条件的字段应该建立索引

3.查询中与其他表关联的字段,外键关系建立索引

4.在高并发的情况下创建复合索引

5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度 (建立索引的顺序跟排序的顺序保持一致)

不适合建立索引的情况

频繁更新的字段不适合建立索引

where条件里面用不到的字段不创建索引

表记录太少,当表中数据量超过三百万条数据,可以考虑建立索引

数据重复且平均的表字段,比如性别,国籍

四、数据库存储引擎

4.1 数据库存储引擎

在这里插入图片描述

4.2 服务层

第二层服务层是MySQL的核心,MySQL的核心服务层都在这一层,查询解析,SQL执行计划分析,SQL执行计划优化,查询缓存。以及跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。通过下图来观察服务层的内部结构:
在这里插入图片描述

4.3 存储引擎层

负责MySQL中数据的存储与提取。 服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。如果对于存储引擎的性能不满意,可以通过修改源码来得到自己想要达到的性能。例如阿里巴巴的X-Engine,为了满足企业的需求facebook与google都对InnoDB存储引擎进行了扩充。

4.4 查看存储引擎

show engines;
发布了46 篇原创文章 · 获赞 4 · 访问量 1299

猜你喜欢

转载自blog.csdn.net/Yauger/article/details/103484527