MySQL临时表分为系统使用的临时表和用户使用的临时表。

系统使用的临时表是指MySQL在执行某些SQL语句时需要依赖临时表来完成整个过程。系统使用的临时表的情况可以分为以下几种:

*  group by和order by中的列不相同,例如:ORDERY BY price GROUP BY name;

*  order by的列或者group by的列不是引用from 表列表中 的第一表,例如:SELECT * from TableA, TableB ORDER BY TableA.price GROUP by TableB.name

*  使用了sql_small_result选项 ,SQL_SMALL_RESULT的意思就是告诉MySQL,结果会很小,请直接使用内存临时表

*  含有distinct的order by语句,例如:ORDERY BY DISTINCT(price)

*  from子查询会用到临时表

  

  查看MySQL中关于临时表的配置参数:

  mysql> show variables like '%tmp_table%';

  +-----------------------+--------------+

  | Variable_name  | Value    |

  +-----------------------+--------------+

  | max_tmp_tables | 32       |

  | tmp_table_size | 47185920 |

  +-----------------------+---------------+

  下面是2个查询中用到了临时表的例子:

  mysql> select * from person;

  +----------+---------+

  | name | age  |

  +-----------+--------+

  | tom  |   22 |

  | tony   |   31 |

  +-----------+--------+

  mysql> select * from grade;

  +------------+-----------+

  | name   | grade |

  +------------+------------+

  | tom    |    22 |

  | tony   |    31 |

  | unkown |    40 |

  +-------------+-------------+  

  mysql> explain select g.name,g.grade from person p,grade g where p.name = g.name group by(g.name);

  +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+

  | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                           |

  +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+

  |  1 | SIMPLE      | p     | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using temporary; Using filesort |

  |  1 | SIMPLE      | g     | ALL  | NULL          | NULL | NULL    | NULL |    3 | Using where; Using join buffer  |

  +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+

  mysql> explain select m.name,p.age from person as p inner join(select person.name  from person,grade where person.name = grade.name )as m on p.name = m.name;

  +----+-------------+------------+------+---------------+------+---------+------+------+--------------------------------+

  | id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra                          |

  +----+-------------+------------+------+---------------+------+---------+------+------+--------------------------------+

  |  1 | PRIMARY     | p          | ALL  | NULL          | NULL | NULL    | NULL |    2 |                                |

  |  1 | PRIMARY     | <derived2> | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where; Using join buffer |

  |  2 | DERIVED     | person     | ALL  | NULL          | NULL | NULL    | NULL |    2 |                                |

  |  2 | DERIVED     | grade      | ALL  | NULL          | NULL | NULL    | NULL |    3 | Using where; Using join buffer |

  +----+-------------+------------+------+---------------+------+---------+------+------+--------------------------------+

   当查询的数据量很大时,临时表又转换为了磁盘临时表,这时的查询速度就会较慢。

  有些情况下MySQL很可能会直接使用磁盘临时表:

   * 表包含TEXT或者BLOB列;

   * GROUP BY 或者 DISTINCT 子句中包含长度大于512字节的列;

   * 使用UNION或者UNION ALL时,SELECT子句中包含大于512字节的列;

常见的避免临时表的方法有:

* 创建索引:在ORDER BY或者GROUP BY的列上创建索引;

* 分拆很长的列:一般情况下,TEXT、BLOB,大于512字节的字符串,基本上都是为了显示信息,而不会用于查询条件, 因此表设计的时候,应该将这些列独立到另外一张表。  

  临时表主要是用于排序和分组,很多业务都是要求排序后再取出详细的分页数据,这种情况下可以将排序和取出详细数据拆分成不同的SQL,以降低排序或分组时临时表的大小,提升排序和分组的效率。

自己定义的临时表可以作为大数据表的一部分,方便查询。

通过语句CREATE TEMPORARY TABLE XXX 来创建应用所需的临时表。我们自定义的临时表有以下一些特点:

  *  临时表的存在的周期是当前登录的session有效,断开连接将会被立即删除,也可手动将其drop table,无论以任何类型创建的临时表,在对应的数据库目录下都没有具体的文件生成;既然是session有效,那么不同的session间是不能访问别人定义的临时表的,不同session定义的临时表名就可以相同。

  * 支持多种类型的表:MyISAM、InnoDB等,通过max_heap_table_size参数值来控制临时表的大小;

  *  为什么要用它呢?临时表可以将我们之后可能频繁使用到的中间数据集临时保存下来,这样就会提高业务的处理速度,再有就是可以减少程序代码量,将一定的逻辑处理放到数据库上去完成,这之间的代价需要实际去评估;到了5.0以后出现了视图,对于开发人员有多了一种可选择的方法,而视图的定义是可以永久保存到磁盘上的,视图是不能重名的。

  

MySQL系统临时表、用户临时表的更多相关文章

  1. MySQL · 特性分析 · 内部临时表

    http://mysql.taobao.org/monthly/2016/06/07/#rd MySQL中的两种临时表 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种 ...

  2. 【MySQL】查询使用临时表

    MySQL查询产生临时表的分析 官网说明的地址:http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html 参考:htt ...

  3. Centos系统mysql 忘记root用户的密码

    Centos系统mysql 忘记root用户的密码: 第一步:(停掉正在运行的mysql) [root@maomao ~]# /etc/init.d/mysqld stop Stopping MySQ ...

  4. mysql命令大全用户管理相关命令

        1.登陆 mysql>mysql -uJDev -p 2.用户管理 mysql>use mysql; 3.查看有哪些登陆用户 mysql> select host,user, ...

  5. 【MySQL笔记】用户管理

    1.账户管理 1.1登录和退出MySQL服务器 MySQL –hhostname|hostIP –P port –u username –p[password] databaseName –e &qu ...

  6. mysql 数据库新增用户

    1.user表中host为%含义: Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1.这里的意思就是说root用户只能通过192.168.1.1的客户 ...

  7. MySQL创建一个用户,指定一个数据库 授权

    Mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ...

  8. 转:mysql 创建一个用户,指定一个数据库

    转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...

  9. mysql添加一个用户

    对于添加mysql的远程访问用户,一定要记得刷新刷新系统权限表不然你怎么弄都是不成功的. insert into mysql.user(Host,User,Password) values(" ...

随机推荐

  1. Codeforces 810C Do you want a date?(数学,前缀和)

    C. Do you want a date? time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  2. c++2(循环和递归)

    其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就 ...

  3. 工作小结(关于webpack)

    今天在工作中遇到了一个新问题,是关于webpack的. 是这样的,我在项目中添加了一个新页面,修改完配置文件后,开始运行,刚开始并没有什么问题,很顺利,后来我又添加了一个页面,然后修改配置文件,然后运 ...

  4. jQuery中获取文档的高度、可视区域高度以及滚动条距页面顶部的高度

    在写页面的时候,经常会碰到这样的情况,就是要获取文档的高度.可视区域高度或者滚动条距页面顶部的高度等情况. 但我总是有些爱搞混淆了,这里还是简单做个笔记吧,这里只限于使用jQuery来获取. 1.获取 ...

  5. 根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一

    根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一 测试数据 java代码 package com.hzf.spark.study; import java.util.ArrayLis ...

  6. c++---天梯赛---大笨钟

    ★题目: ★思路分析: 对可能的情况进行分类处理.在这里我把它们分成了3大类. ①不在敲钟时间 ②在敲钟时间但为整点 ③在敲钟时间且不为整点. 在敲钟时间段内我们可分别对晚8点前后进行分类讨论, 我们 ...

  7. PhoneGap安装手顺

    http://docs.phonegap.com/getting-started/1-install-phonegap/desktop/

  8. angular4 中自定义pagination组件

    你用Angular 吗? 一.介绍 一个基于angular4 开发的可以分页的组件.组件的好处就是可以复用,复用.....作为一个前端码农,开始的分页功能实现是我用jquery写的,其他同事用的时候都 ...

  9. 借助 Vue 来构建单页面应用

    原文: https://github.com/MeCKodo/vue-tutorial 主题 Vue.js (1/2)Vue构建单页应用最佳实战 前言 我们将会选择使用一些vue周边的库 1.使用no ...

  10. call 和 ret 指令

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...