专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
51好读  ›  专栏  ›  数据分析与开发

MySQL 中的两种临时表

数据分析与开发  · 公众号  · 数据库  · 2017-02-23 20:51

正文

请到「今天看啥」查看全文


: "22.00"

},

"ordering_operation" : {

"using_temporary_table" : true ,

...


2))关掉BNL后,ORDER BY将直接使用filesort。


mysql > set optimizer_switch = 'block_nested_loop=off' ;

Query OK , 0 rows affected ( 0.00 sec )

mysql > explain format = json select * from t1 , t1 as t2 order by t1 . a ;

EXPLAIN

{

"query_block" : {

"select_id" : 1 ,

"cost_info" : {

"query_cost" : "25.00"

},

"ordering_operation" : {

"using_filesort" : true ,

...


2)ORDER BY的列不属于执行计划中第一个连接表的列。


例如:


mysql > explain format = json select * from t as t1 , t as t2 order by t2 . a ;

EXPLAIN

{

"query_block" : {

"select_id" : 1 ,

"cost_info" : {

"query_cost" : "25.00"

},

"ordering_operation" : {

"using_temporary_table" : true ,

...


3)如果ORDER BY的表达式是个复杂表达式。


那么什么样的ORDER BY表达式,MySQL认为是复杂表达式呢?


1))如果排序表达式是SP或者UDF。


例如:


drop function if exists func1 ;

delimiter |

create function func1 ( x int )

returns int deterministic

begin

declare z1 , z2 int ;

set z1 = x ;

set z2 = z1 + 2 ;

return z2 ;

end |

delimiter ;

explain format = json select * from t1 order by func1 ( a );

{

"query_block" : {

"select_id" : 1 ,

"cost_info" : {

"query_cost" : "2.20"

},

"ordering_operation" : {

"using_temporary_table" : true ,

...


2))ORDER BY的列包含聚集函数


为了简化执行计划,我们利用INDEX来优化GROUP BY语句。

例如:


create index idx1 on t1 ( a );

explain format = json SELECt a FROM t1 group by a order by sum ( a );

|







请到「今天看啥」查看全文