虚拟表,顾名思义,就是实际上并不存在(物理上不存在),但是逻辑上存在的表。这样说很抽象,还是看一些实际的例子吧。
在MySQL中,存在三种虚拟表:临时表、内存表和视图。
一、mysql临时表
1、什么是临时表
临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作。 临时表的数据和表结构都储存在内存之中,退出时,其所占的空间会自动被释放。
2、创建临时表
(1)定义字段
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL)
(2)直接将查询结果导入临时表
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
3、查询临时表
select * from tmp_table
4、删除临时表
drop table tmp_table
二、临时表的应用
当工作在十分大的表上运行时,在实际操作中你可能会需要运行很多的相关查询,来获的一个大量数据的小的子集。较好的办法,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表,然后对这些表运行查询。
1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。
2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。
3)、临时表默认的是MyISAM,但是可以修改。
4)、可以把一些经常访问的数据放到临时表中,这样访问时会快一些,因为数据是在服务器内存中,另外每次查询的时候,数据库都需要生成一些临时数据在临时表里
三、临时表使用注意事项:
(1)临时表只在当前连接可见,当这个连接关闭的时候,会自动drop。这就意味着你可以在两个不同的连接里使用相同的临时表名,并且相互不会 冲突,或者使用 已经存在的表,但不是临时表的表名。(当这个临时表存在的时候,存在的表被隐藏了,如果临时表被drop,存在的表就可见了)。
(2) 临时表只能用在 memory,myisam,merge,或者innodb引擎。
3)临时表不支持mysql cluster(簇)。
4)在同一个query语句中,你只能查找一次临时表。例如:下面的就不可用
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
如果在一个存储函数里,你用不同的别名查找一个临时表多次,或者在这个存储函数里用不同的语句查找,这个错误都会发生。
5)show tables 语句不会列举临时表,但是会列出内存表。
6)你不能用rename来重命名一个临时表。但是,你可以alter table代替:
mysql>ALTER TABLE orig_name RENAME new_name;
四、内存表
1、内存表:表结构建在磁盘里,数据在内存里 ,当停止服务后,表中的数据丢失,而表的结构不会丢失。内存表也可以被看作是临时表的一种。
2、内存表的建立:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP 注意: TYPE = HEAP必须要有。
五、内存表的应用
内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库。
1、heap对所有用户的连接是可见的,这使得它非常适合做缓存。
2、一旦服务器重启,所有heap表数据丢失,但是heap表结构仍然存在,因为heap表结构是存放在实际数据库路径下的,不会自动删除。重启之后,heap将被清空,这时候对heap的查询结果都是空的。
3、如果heap是复制的某数据表(创建普通用户表这些也会丢失),则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引,如果需要的话。
4、对于重启造成的数据丢失,有以下的解决办法:
a、在任何查询之前,执行一次简单的查询,判断heap表是否存在数据,如果不存在,则把数据重新写入,或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件,在需要用该heap表的页面随时调用,比较方便。
b、对于需要该heap表的页面,在该页面第一次且仅在第一次查询该表时,对数据集结果进行判断,如果结果为空,则需要重新写入数据。这样可以节省一次查询。
c、更好的办法是在mysql每次重新启动时自动写入数据到heap,但是需要配置服务器,过程比较复杂,通用性受到限制。
六、内存表的注意事项
1、heap不允许使用xxxTEXT和xxxBLOB数据类型;只允许使用=和<=>操作符来搜索记录(不允 许& amp; lt;、>、<=或>=);mysql4.1版本之前不支持auto_increment;只允许对非空数据列进行索引(not null)。
注:操作符 “<=>” 说明:NULL-safe equal.这个操作符和“=”操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。
2、内存表可以通过max_heap_table_size = 2048M来加大使用的内存。
3、内存表必须使用memory存储引擎
视图和临时表的区别
视图只是一条预编译的SQL语句,并不保存实际数据
临时表是保存在tempdb中的实际的表
物理空间的分配不一样,试图不分配空间, 临时表会分配空间
视图是一个快照,是一个虚表
临时表是客观存在的表类型对象Create TEMPORARY table
它们的结构一个是表、一个快照。可以把视图像象成联合表的快捷方式
视图存在性能缺陷 视图不会用到索引?有性能问题?
- 浏览: 167062 次
- 性别:
- 来自: 南京
最新评论
-
yjsxxgm:
yjsxxgm 写道yjsxxgm 写道
揭秘淘宝286亿海量图片存储与处理架构 -
yjsxxgm:
yjsxxgm 写道
揭秘淘宝286亿海量图片存储与处理架构 -
yjsxxgm:
yjsxxgm 写道
揭秘淘宝286亿海量图片存储与处理架构 -
yjsxxgm:
揭秘淘宝286亿海量图片存储与处理架构 -
raodun:
哥们,nginx做websphere的会话保持何如写?
nginx的会话保持
相关推荐
### MySQL临时表与派生表详解 #### 一、MySQL临时表 **1.1 临时表概述** MySQL中的临时表是一种特殊的表类型,主要用于存储临时数据或中间结果集,适用于那些需要多次查询同一结果集的场景。根据存储位置的不同,...
视图、触发器、临时表、派生表
临时表分为内存临时表和磁盘临时表,前者使用memory存储引擎,后者通常使用myisam(在MySQL 5.7.6之前)或innodb(5.7.6之后,默认存储引擎可通过`internal_tmp_disk_storage_engine`参数设置)存储引擎。...
- **ALGORITHM**:用于指定执行策略,默认为UNDEFINED,其他选项有MERGE(视图和基表合并执行)和TEMPTABLE(使用临时表)。 - **WITH CHECK OPTION**:限制通过视图进行的更新操作必须满足视图定义中的条件。 ####...
在实际操作中,需要对产生的临时表数据和表结构进行管理和优化,以确保性能。 总之,MySQL 5.7的独立临时表空间特性为用户带来了更多的便利,但在使用时需要注意一些可能的问题和限制。通过合理配置和监控,以及...
而临时表和视图则提供了不同的数据抽象和管理方式,临时表适用于会话级别的临时数据存储,而视图则提供了数据的逻辑视图,方便查询和管理。理解并熟练掌握这些概念和技巧,对于优化数据库操作和提升数据库性能至关...
7. **监控和调整**:定期监控数据库的资源使用情况,包括内存和临时表空间,以便及时发现和解决问题。 在实际应用中,需要根据具体数据库系统(如Oracle、MySQL、SQL Server等)的特点和配置进行针对性的调整。通过...
在进行数据同步时,除了临时表,还应注意其他可能影响同步的因素,比如事务处理、触发器、视图和存储过程。确保在同步过程中,这些组件不会导致意外的数据更改或错误。例如,如果一个存储过程在临时表上执行操作,...
MySQL 数据库结构管理小工具,MySQL 表、视图、触发器、函数、过程结构同步管理,支持MySQL5.x ~ MySQL8,可保存创建对象的选择,导出SQL,当表、过程超过100着实令人头大,特意读取了表等的创建时间,可根据时间...
10. **视图、临时表和派生表**:理解视图的概念,学习如何创建和使用临时表,以及派生表的应用场景。 11. **触发器、存储过程和异常处理**:深入理解数据库的触发器,创建和调用存储过程,以及如何处理运行时的异常...
`MERGE`算法试图合并输入查询和视图定义,`TEMPTABLE`会创建临时表来存储结果,而`UNDEFINED`则让MySQL自行选择合适的算法。如果`MERGE`不适用,MySQL会默认使用`UNDEFINED`,并在可能的情况下选择`MERGE`以提高效率...
- **具化式**:先执行视图的定义,生成临时表,然后外部查询再操作这个临时表。 MySQL会根据情况自动选择合适的处理方式,也可以在创建视图时指定使用哪种机制。 ### 五、视图的优势 视图的主要优点包括: - **...
总的来说,MySQL视图和临时表都是为了简化数据操作和管理,但它们在使用场景和功能上有显著差异。视图主要用于数据抽象和简化查询,而临时表主要用于存储会话期间的中间结果,两者在不同情况下都有其独特的价值。...
其中,ALGORITHM表示视图选择的算法,UNDEFINED表示MySQL将自动选择所要使用的算法,MERGE将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分,TEMPTABLE将视图的结果存入临时表,然后使用...
7. Reload_priv:赋予用户刷新和重新加载MySQL内部缓存(如权限、主机、查询和表)的能力。 8. Shutdown_priv:持有此权限的用户可以关闭MySQL服务器,通常只给予管理员。 9. Process_priv:允许用户查看其他用户...
6. 存储引擎:MySQL支持不同的存储引擎,如InnoDB(默认,支持事务处理和外键)、MyISAM(不支持事务,但读取速度快)和Memory(数据存储在内存中,适合临时表)等,根据应用场景选择合适的引擎至关重要。...
3. **存储过程(Procedures)**:执行更复杂的操作,如清理无用的临时表或者分析索引效率。 通过cpp-sys,开发者能够更有效地调试和优化他们的MySQL应用程序,从而提升整体数据库性能。此外,由于它是用C++实现的,...
- `ALGORITHM`:选择不同的合并策略,如默认的UNDEFINED,MERGE(尝试合并基础表和视图的查询),或TEMPTABLE(创建临时表来存储结果)。 - `DEFINER`:定义视图的创建者,决定执行权限。 - `SQL SECURITY`:定义...