临时表的特性

  • 临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间,也可以在当前连接未关闭时,手动删除临时表。
  • 不同连接可以各自创建名字一样的临时表,不会相互冲突,这点不同于 Memory的引擎表
  • 你应该测试临时表看看它们是否真的比对大量数据库运行查询快。如果数据很好地索引,临时表可能一点不快。
  • 临时表默认的存储引擎是Innodb,数据存储在磁盘里面,且不会使用索引,即使该列在原表中有索引也不会使用

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

  1. CREATE TEMPORARY TABLE user_tem as select * from user where id<200;
  2. DROP TEMPORARY TABLE IF EXISTS temp_tb;

视图

实现视图,优化器有2种选择:临时表或者合并算法(MERGE),这是由生成视图的SQL决定的
视图本身并不存储数据,只是存储了一段待执行的sql语句而已,查询视图的时候,仍然会访问原表去查询,所以查询性能上并不能提升,更多的是简化Sql的复杂性、安全控制的考虑。如果提升性能的话,临时表可能是更好的选择。
视图的优点:

  1. 视图可以简化应用上层的操作,让应用更专注于其所关心的数据。把一个多表关联的复杂SQL封装成一个view,直接查询view里面的字段即可,不再需要写一坨sql了。
  2. 其次,视图能够对敏感数据提供安全保护,比如:对不同的用户定义不同的视图,可以使敏感数据不出现在不应该看到这些数据的用户视图上;也可以使用视图实现基于列的权限控制,而不需要真正的在数据库中创建列权限。
  3. 再者,视图可以方便系统运维,比如:在重构schema的时候使用视图,使得在修改视图底层表结构的时候,应用代码还可以继续运行不报错。