Mysql 在联合中使用Order By NULL

Mysql 在联合中使用Order By NULL,mysql,sql,Mysql,Sql,我有一个查询(见下文),我有一个自定义开发的UDF,用于计算某些点是否位于多边形(联合中的第一个查询)或圆形(联合中的第二个查询)形状内 当我为查询运行解释时,我得到以下结果: id select_type table type possible_keys

我有一个查询(见下文),我有一个自定义开发的UDF,用于计算某些点是否位于多边形(联合中的第一个查询)或圆形(联合中的第二个查询)形状内

当我为查询运行解释时,我得到以下结果:

 id      select_type     table       type     possible_keys                                                                                                                                              key                                  key_len     ref                       rows     Extra                           
 ------  --------------  ----------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------  -----------------------------------  ----------  ------------------------  -------  ------------------------------- 
 1       PRIMARY         d           const    PRIMARY                                                                                                                                                    PRIMARY                              4           const                     1        Using temporary; Using filesort 
 1       PRIMARY         c           ref      PRIMARY,fk_mtp_idx_geo_boundary_mtp_idx,fk_mtp_idx_geo_boundary_geo_boundary,fk_mtp_idx_geo_boundary_mtp_mem_idx,fk_mtp_idx_geo_boundary_geo_boundary_mem  fk_mtp_idx_geo_boundary_mtp_idx      4           const                     9                                        
 1       PRIMARY         b           eq_ref   PRIMARY,fk_geo_boundary_inquiry,fk_geo_boundary_geo_boundary_type                                                                                          PRIMARY                              4           gothim.c.geo_boundary_id  1        Using where                     
 1       PRIMARY         e           eq_ref   PRIMARY                                                                                                                                                    PRIMARY                              4           gothim.b.inquiry_id       1        Using where                     
 1       PRIMARY         f           ref      fk_inquiry_device_mem_inquiry                                                                                                                              fk_inquiry_device_mem_inquiry        4           gothim.e.inquiry_id       2                                        
 1       PRIMARY         a           ref      fk_geo_boundary_vertex_geo_boundary                                                                                                                        fk_geo_boundary_vertex_geo_boundary  4           gothim.b.geo_boundary_id  11       Using where                     
 2       UNION           d           const    PRIMARY                                                                                                                                                    PRIMARY                              4           const                     1        Using temporary; Using filesort 
 2       UNION           c           ref      PRIMARY,fk_mtp_idx_geo_boundary_mtp_idx,fk_mtp_idx_geo_boundary_geo_boundary,fk_mtp_idx_geo_boundary_mtp_mem_idx,fk_mtp_idx_geo_boundary_geo_boundary_mem  fk_mtp_idx_geo_boundary_mtp_idx      4           const                     9                                        
 2       UNION           b           eq_ref   PRIMARY,fk_geo_boundary_inquiry,fk_geo_boundary_geo_boundary_type                                                                                          PRIMARY                              4           gothim.c.geo_boundary_id  1        Using where                     
 2       UNION           e           eq_ref   PRIMARY                                                                                                                                                    PRIMARY                              4           gothim.b.inquiry_id       1        Using where                     
 2       UNION           f           ref      fk_inquiry_device_mem_inquiry                                                                                                                              fk_inquiry_device_mem_inquiry        4           gothim.e.inquiry_id       2                                        
 (null)  UNION RESULT    <union1,2>  ALL      (null)                                                                                                                                                     (null)                               (null)      (null)                    (null)   Using filesort                  

 12 record(s) selected [Fetch MetaData: 1ms] [Fetch Data: 5ms] 
id选择类型表类型可能的键长度参考行额外
------  --------------  ----------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------  -----------------------------------  ----------  ------------------------  -------  ------------------------------- 
1主d常量主4常量1使用临时;使用文件排序
1主c参考主、fk_mtp_idx_geo_边界、fk_idx_geo_边界、fk_mtp_idx_geo_边界、fk_idx_geo_边界、fk_mtp_idx geo_边界、fk_geo_边界、fk_mtp_idx geo_边界
1小学b eq_ref小学、fk_geo_boundary小学、fk_geo_boundary小学、fk_geo_boundary小学、fk_geo_boundary小学、fk_geo_boundary小学4获取他.c.geo_boundary\u id 1使用where
1小学e eq_ref小学4获取他b.查询id 1使用where
1主f参考fk\U查询设备\内存查询fk\U查询设备\内存查询4获取他e.查询id 2
1主a参考fk_geo_边界\u顶点\u geo_边界fk_geo_边界\u顶点\u geo_边界4获取他.b.geo_边界id 11使用其中
2联会d const小学4 const 1使用临时;使用文件排序
2联盟c参考基准、fk_mtp_idx_地理边界_mtp_idx、fk_idx_地理边界_地理边界、fk_mtp_idx_地理边界_idx、fk_mtp_idx地理边界_地理边界_idx 4共9个
2 UNION b eq_ref PRIMARY、fk_geo_boundary、fk_geo_boundary、fk_boundary、fk_geo_boundary类型PRIMARY 4 gothim.c.geo_boundary id 1使用where
2 UNION e eq_ref小学4获取他b.查询id 1使用where
2参考fk_查询设备(成员)查询fk_查询设备(成员)查询4获取他的e查询id 2
(null)使用filesort的联合结果ALL(null)(null)(null)(null)(null)
选择12条记录[获取元数据:1ms][获取数据:5ms]
现在,我可以拆分查询并使用ORDER BY NULL技巧来摆脱filesort,但是当我尝试将其添加到联合的末尾时,它不起作用

我正在考虑将查询拆分为两个查询,或者完全不使用联合来重新编写它(尽管这当然有点困难)。我的另一个缺点是,我们在生产中使用了这一点,我想限制更改-我希望能够将ORDER BY NULL添加到查询的末尾并完成它,但它与联合不起作用


任何帮助都将不胜感激。

也许可以试试类似的方法

SELECT *
FROM
(
    [your entire query here]
) DerivedTable
ORDER BY NULL
我从未使用过MySQL,所以如果我错过了剧情,请原谅:)


编辑:如果单独运行每个查询(正如您所说,这是可行的),但将数据插入到临时表中,该怎么办。然后,在结束时只需从临时表中进行选择。

您是否尝试将
联合
更改为
联合所有

UNION
尝试删除重复的行。为了做到这一点,它必须对中间结果进行排序,这些结果可能会解释您在中看到的内容
SELECT *
FROM
(
    [your entire query here]
) DerivedTable
ORDER BY NULL
select  *
from    (
          select  b.geo_boundary_id      
                  , GeoBoundaryContains( c.tpi_geo_boundary_coverage_type_id, 29.287437, -95.055807, b.centroid_lat, b.centoid_lon, b.radius ) in_out      
          from    geo_boundary b 
                  join trackpoint_index_geo_boundary_mem c on c.geo_boundary_id = b.geo_boundary_id 
          where   b.geo_boundary_type_id = 2  
          group by
                  b.geo_boundary_id 
          union all        
          select  a.geo_boundary_id 
                  , GeoBoundaryContains(c.tpi_geo_boundary_coverage_type_id, 29.287437, -95.055807, a.lat, a.lon, a.geo_boundary_vertex_id ) in_out 
          from    geo_boundary_vertex a 
                  join geo_boundary b on b.geo_boundary_id = a.geo_boundary_id 
                  join trackpoint_index_geo_boundary_mem c on c.geo_boundary_id = b.geo_boundary_id 
          where   b.geo_boundary_type_id = 3  
          group by 
                  a.geo_boundary_id 
        ) s
        inner join (                  
          select  e.inquiry_match_type_id 
                  , e.inquiry_id 
                  , e.external_id 
                  , COALESCE(f.inquiry_device_id,0) inquiry_device_id 
                  , b.external_info1 
                  , b.external_info2 
                  , b.geo_boundary_id 
                  , b.geo_boundary_type_id 
          from    geo_boundary b 
                  join trackpoint_index_geo_boundary_mem c on c.geo_boundary_id = b.geo_boundary_id 
                  join trackpoint_index_mem d on d.trackpoint_index_id = c.trackpoint_index_id 
                  join inquiry_mem e on e.inquiry_id = b.inquiry_id left 
                  outer join inquiry_device_mem f on f.inquiry_id = e.inquiry_id and f.device_id = 3201 
          where   d.trackpoint_index_id = 3127  
                  and b.geo_boundary_type_id IN (2, 3)
                  and e.expiration_date >= now() 
        ) r on r.geo_boundary_id = s.geo_boundary_id    
(
SELECT  *
FROM    table1, …
GROUP BY
        id
ORDER BY 
        NULL
)
UNION ALL
(
SELECT  *
FROM    table2, …
GROUP BY
        id
ORDER BY 
        NULL
)
(
SELECT  *
FROM    table1, …
GROUP BY
        id
ORDER BY 
        NULL
LIMIT 100000000
)
UNION ALL
(
SELECT  *
FROM    table2, …
GROUP BY
        id
ORDER BY 
        NULL
LIMIT 100000000
)