MySQL系统临时表、用户临时表
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系统临时表、用户临时表的更多相关文章
- MySQL · 特性分析 · 内部临时表
http://mysql.taobao.org/monthly/2016/06/07/#rd MySQL中的两种临时表 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种 ...
- 【MySQL】查询使用临时表
MySQL查询产生临时表的分析 官网说明的地址:http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html 参考:htt ...
- Centos系统mysql 忘记root用户的密码
Centos系统mysql 忘记root用户的密码: 第一步:(停掉正在运行的mysql) [root@maomao ~]# /etc/init.d/mysqld stop Stopping MySQ ...
- mysql命令大全用户管理相关命令
1.登陆 mysql>mysql -uJDev -p 2.用户管理 mysql>use mysql; 3.查看有哪些登陆用户 mysql> select host,user, ...
- 【MySQL笔记】用户管理
1.账户管理 1.1登录和退出MySQL服务器 MySQL –hhostname|hostIP –P port –u username –p[password] databaseName –e &qu ...
- mysql 数据库新增用户
1.user表中host为%含义: Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1.这里的意思就是说root用户只能通过192.168.1.1的客户 ...
- MySQL创建一个用户,指定一个数据库 授权
Mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ...
- 转:mysql 创建一个用户,指定一个数据库
转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...
- mysql添加一个用户
对于添加mysql的远程访问用户,一定要记得刷新刷新系统权限表不然你怎么弄都是不成功的. insert into mysql.user(Host,User,Password) values(" ...
随机推荐
- c++(堆排序)
堆排序是另外一种常用的递归排序.因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用.堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的.打一个比方说,处于大堆中的每一个数据都必须满足这样一个 ...
- c++(合并排序)
前面一篇博客提到的快速排序是排序算法中的一种经典算法.和快速排序一样,合并排序是另外一种经常使用的排序算法.那么合并排序算法有什么不同呢?关键之处就体现在这个合并上面. 合并算法的基本步骤如下所 ...
- <input type="text">和<textarea>的区别
在我们开发时经常需要用到输入框,通常解决办法就是<input type="text">和<textarea>,那么这两个标签有什么区别呢? 一:<i ...
- 【Linux搭建创建FTP服务器】---完美解决 - 费元星
配置大红字文件置顶: vsftp d.conf 4.5KB useradd -d /home/bai_du -s /sbin/nologin bai_du 修改访问权限: usermod ...
- Spark算子--first、count、reduce、collect、lookup
转载请标明出处http://www.cnblogs.com/haozhengfei/p/4b8582c8dde1529abb11e4ccc8296171.html first.count.reduce ...
- Linux 中出现的-bash: syntax error near unexpected token `
版权声明:本文为博主原创文章,未经博主允许不得转载. 在Linux 5中导入数据时,出现下面的错误. -bash: syntax error near unexpected token `(' 检查了 ...
- 修真院java后端工程师学习课程--任务1(day one)
这是我从学习资料-线下报名-北京报名截取的报名截图,从图中我们可以看出我们的报名对象应该有姓名,qq,修真类型,预计入学时间,毕业院校,线上学号,日报链接,立愿,辅导师兄等属性,其中线上学号是主码. ...
- 小白的Python之路 day5 logging模块
logging模块的特点及用法 一.概述 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你 ...
- Appium移动自动化测试之—基于java的iOS环境搭建
本文仅供参考,同时感谢帮助我搭建环境的同事 操作系统的名称:Mac OS X操作系统的版本:10.12.6 接下来我们开始踏上搭建Appium+java+ios之路,本文只说个大概,毕竟本机已经装过了 ...
- 动态添加div及对应的js、css文件
动态添加div及对应的js.css文件 在近期的项目开发中需要在首页中添加很多面板型的div,直接加载代码显得很繁琐,于是利用js封装一个动态添加div及其对应css文件和js文件的方法供大家参考使用 ...