mysql派生表怎么联合 派生表和子查询区别( 二 )


上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性,不怎么受欢迎,容易引起错误 。
假设我们现在把sql中的 distinct(a.id) tid ,去掉,会发现子查询(或者叫:临时表)中的order by a.id desc失效了 。
为什么会这样呢?
原理分析:
我们这里使用了临时表排序,继而对其结果进行分组 , 结果显示失败,加了distinct(a.id) tid,后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效 , 必须满足三个条件:
一旦外部表使用了group by, 那么临时表(派生表 derived table)将不会执行filesort操作(即 order by 会被忽略 ) 。之后我使用了limit可以使其生效,原因是因为要使派生表order by生效 ,  派生表可以通过使用group by、limit、having、distinct等等使其生效 (方法有好多,详情可看文档)
原文链接:
mysql临时表创建后存放在那里?怎样给某一个数据库创建临时表?MySQL 需要创建隐式临时表来解决某些类型的查询 。往往查询的排序阶段需要依赖临时表 。例如,当您使用 GROUP BY,ORDER BY 或DISTINCT 时 。这样的查询分两个阶段执行:首先是收集数据并将它们放入临时表中,然后是在临时表上执行排序 。
对于某些 UNION 语句,不能合并的 VIEW , 子查询时用到派生表,多表 UPDATE 以及其他一些情况,还需要使用临时表 。如果临时表很小,可以到内存中创建 , 否则它将在磁盘上创建 。MySQL 在内存中创建了一个表 , 如果它变得太大,就会被转换为磁盘上存储 。内存临时表的最大值由 tmp_table_size 或 max_heap_table_size 值定义,以较小者为准 。MySQL 5.7 中的默认大小为 16MB 。如果运行查询的数据量较大,或者尚未查询优化,则可以增加该值 。设置阈值时,请考虑可用的 RAM 大小以及峰值期间的并发连接数 。你无法无限期地增加变量,因为在某些时候你需要让 MySQL 使用磁盘上的临时表 。
注意:如果涉及的表具有 TEXT 或 BLOB 列,则即使大小小于配置的阈值,也会在磁盘上创建临时表 。
mysql派生表怎么联合的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于派生表和子查询区别、mysql派生表怎么联合的信息别忘了在本站进行查找喔 。

推荐阅读