Mysql 临时表 视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 临时表 视图相关的知识,希望对你有一定的参考价值。

参考技术A https://www.jianshu.com/p/01b9f028d9c7

使用场景:临时表主要用于对大数据量的表上作一个子集,提高查询效率。普通临时表,从大表中捞取部分的数据,可以在一个连接内重复使用,提速

实现视图,优化器有2种选择:临时表或者合并算法(MERGE),这是由生成视图的SQL决定的

视图本身并不存储数据,只是存储了一段待执行的sql语句而已,查询视图的时候,仍然会访问原表去查询,所以查询性能上并不能提升,更多的是简化Sql的复杂性、安全控制的考虑。如果提升性能的话,临时表可能是更好的选择。

视图的优点:

Mysql 临时表+视图

学习内容:

临时表和视图的基本操作...

临时表与视图的使用范围...

1.临时表

  临时表:临时表,想必大家都知道这个概念的存在。。。但是我们什么时候应该使用到临时表呢?当一个数据库存在着大量的数据的时候,我们想要获取到这个数据集合的一个子集,那么我们就可以使用临时表来保存我们想要的数据。。然后对临时表进行操作就可以了...使用临时表必然是有原因的。。使用临时表会加快数据库的查询性能....

复制代码
create temporary table tmp_table  //新建一个临时表
(
    name varchar(10) not null,
    value integer not null,
);
临时表的创建很简单,只需要加一个temporary关键字就完成了表的创建...

临时表在我们与数据库断开连接的时候,系统将会自动的删除临时表并释放其占用空间..除了这种方式,我们还可以手动进行删除。。。

drop table tmp_table //与我们正常删除表的语句一样...

create temporary table tmp_table select * from table_name;//将我们查询的数据直接插入到临时表当中...

alter table tmp_table rename ttmp_table;//使用alter来重命名临时表...

rename table tmp_table to ttmp_table;//rename在临时表中是不允许使用的...会发生错误。。。
复制代码

  并不是我们使用了临时表数据库的查询性能一定就会得到提升,当我们的数据使用了很好的索引的时候,临时表的速度可能并不快...那么是不是任何时候都可以使用临时表呢?临时表的使用也是有以下限制的:

i.临时表只能使用在memory,myisam,merge,innodb存储引擎下。。。

ii.临时表不支持mysql簇。。

iii.在同一个query语句中,我们只能查询一次临时表。。

iv.show table语句不会列举临时表信息..

v.不能使用rename来重命名一个临时表,但是我们可以使用alter table语句来代替...

再举一个实际的例子:

复制代码
create table user_info
(
   user_id int not null,
   user_name varchar(50) not null
);

insert into user_info values(1,\'aa\'),(2,\'bb\').......//假设我们插入了10000条数据信息...那么我们想要查询id>5000 and id<8000的数据信息,那么我们就可以使用一个临时表了...

drop procedure if exists query_performance_test; //如果存在这个存储过程则删除掉...

delimiter $$ //设置$$符号为mysql的结束符,而不是分号了...

create procedure query_performance_test()
begin    //以begin开始
       declare begintime;  //声明变量
       declare endtime;
       set begintime=curtime();  //设置为当前时间...
       drop temporary if exists userinfo_tmp;  //如果临时表存在则删除掉当前临时表...
       create temporary table userinfo_tmp//新建临时表
       (
            i_userid int not null,
            v_username varchar(50) not null
       ) engine=memory;
       insert into userinfo_tmp(i_userid,v_username) select user_id,user_name from userinfo where userid>5000 and userid<8000;  //将我们想要查询的数据放置到临时表中...
       select * from userinfo_tmp;
       set endtime=curtime();
       select endtime-begintime;
end  //存储过程定义完毕,以end结束...

delimiter; //将结束符号重新定义为默认的分号....

call query_profromance_test(); //调用存储过程....
复制代码

最后的结果就会输出id在5000—8000之间的数据信息,并且还会输出查询的时间信息....

2.视图

  视图分为普通视图和物化视图,普通视图是虚拟表,就是把数据库中的基础数据表的数据进行重新归类,更易于使用和理解。物化视图是实体表,除了把视图数据进行视图存储外,其他类似普通视图,但查询速度一般要比普通视图快,一般用于大数据量的视图。

优点:

1.安全性:一般来时当我们创建一个数据库的时候有一些重要的信息是不希望用户看见的,那么我们就可以建立一个视图来设置一个权限,使得用户只能查看自己的基本数据...更重要的数据用户是无法得到的...

2.查询的性能有所改善...

3.对于复杂查询的需求,可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。比如进行多表查询时,我们希望使用一个统一的方式进行查询,那么我们建立一个视图,将每一个表的数据都放入到视图当中去。。。最后我们对视图进行操作,我们就可以得到想要的数据信息了....

复制代码
CREATE TABLE student (stuno INT ,stuname NVARCHAR(60))

CREATE TABLE stuinfo (stuno INT ,class NVARCHAR(60),city NVARCHAR(60))

INSERT INTO student VALUES(1,\'wanglin\'),(2,\'gaoli\'),(3,\'zhanghai\')

INSERT INTO stuinfo VALUES(1,\'wuban\',\'henan\'),(2,\'liuban\',\'hebei\'),(3,\'qiban\',\'shandong\')

-- 创建视图
CREATE VIEW stu_class(id,NAME,glass) AS SELECT student.`stuno`,student.`stuname`,stuinfo.`class`
FROM student ,stuinfo WHERE student.`stuno`=stuinfo.`stuno`

SELECT * FROM stu_class//显示视图的结果...
+----+----------+--------+
| id | NAME     | glass  |
+----+----------+--------+
|  1 | wanglin  | wuban  |
|  2 | gaoli    | liuban |
|  3 | zhanghai | qiban  |
+----+----------+--------+

describe stu_class;//显示视图的基本信息...

show table status like \'stu_class\'//使用show方法显示视图的信息....

show create view stu_class //显示视图的详细信息。。。显示视图名称基本信息+视图中内部操作的代码等等....

修改视图:
1.使用create or replace
mysql> delimiter //
mysql> create or replace view `stu_class` as select 
    -> `student`.`stuno` as `id` from(`student` join `stuinfo`) //join将两个表格进行联合...
    -> where (`student`.`stuno`=`stuinfo`.`stuno`)//
delimter;

desc stu_class; // desc 是descbibe的缩写,在数据库中写哪个都允许...

select * from stu_class;  

2.使用alter 。。。

alter view stu_class as select stuno from student;

更新视图。。。

UPDATE stu_class SET stuname=\'xiaofang\' WHERE stuno=2//很简单,没什么过多的东西。。。。

删除视图:
drop view if exists stu_class;
复制代码

更新的注意事项:

(1)视图中包含基本中被定义为非空的列

(2)定义视图的SELECT语句后的字段列表中使用了数学表达式

(3)定义视图的SELECT语句后的字段列表中使用聚合函数

(4)定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句

那么我们到底什么时候能使用到视图呢?

  在我们定义存储过程的时候,我们为了加快查询的效率,对数据进行复杂处理时,将代码封装在存储过程中,当我们调用存储过程的时候即可完成我们的查询操作...通过代码来完成对数据的操作....以便于我们在每次使用这类查询时只需要调用存储过程即可....存储过程的结构属于一个集合...

  而视图的结构是一个表,一个虚表,不进行实际的存储,但是我们在操作视图的同时,那么也就代表着操作着这个视图的基表...视图让我们看到的是我们想要的数据信息...给我的感觉,使用视图还是由于他的安全性,可以保存重要的信息。。用户只能通过视图来对自己的那部分信息进行操作,而没有权限对其他重要信息进行操作....

以上是关于Mysql 临时表 视图的主要内容,如果未能解决你的问题,请参考以下文章

MySQL视图

mysql创建临时表,将查询结果插入已有表中

第十一节:视图和临时表

MySQL视图

Spark SQL 2.1 是不是支持将临时表或配置单元表写入 Mysql/Oracle?

mysql 内存表和一般表的区别