如何改进这个巨大的SQL查询?

时间:2012-08-26 03:24:22

标签: mysql sql

我有一个很慢的SQL查询(对于MySQL)。它是两个select语句的联合。我尝试过不同的东西,但是任何轻微的变化都会给我一个与原版不同的结果集。任何有关改进它的帮助将不胜感激。谢谢。这是SQL:

   (SELECT  
            CONCAT(city_name,', ',region) value, 
            latitude,
            longitude,
            id,
            population,
    ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) 
    AS distance,
    CASE region
    WHEN '$region' THEN 1
    ELSE 0
    END AS region_match
    FROM `cities` 
    $where and foo_count > 5
    ORDER BY region_match desc, foo_count desc
    limit 0, 11)
    UNION
    (SELECT   
            CONCAT(city_name,', ',region) value, 
            latitude,
            longitude,
            id,
            population,
    ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) 
    AS distance,
    CASE region
    WHEN '$region' THEN 1
    ELSE 0
    END AS region_match
    FROM `cities` 
    $where
    ORDER BY region_match desc, population desc, distance asc
    limit 0, 11)
    limit  0, 11

SQL确实采用了一些内插值(以美元符号($)为前缀)。

1 个答案:

答案 0 :(得分:1)

以下可能给出相同的结果(我不确定如何在SQL中调用最大/最小函数,但你应该知道 - 你需要从foo_count派生两个字段它将你的UNION第一部分的项目与第二部分的项目分开,并允许在第一部分内排序,而不会干扰第二部分的顺序) - 当然,你以后需要第二个查询来抛出其他字段再次:

SELECT   
            CONCAT(city_name,', ',region) value,  
            latitude, 
            longitude, 
            id, 
            population, 
    ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) )  
    AS distance,
    min ( 6, max (foo_count, 5)) AS group_discriminator,
    max ( 6, foo_count) AS rank_for_use_in_first_group,
    CASE region 
    WHEN '$region' THEN 1 
    ELSE 0 
    END AS region_match 
    FROM `cities`  
    $where
    ORDER BY group_discriminator desc, region_match desc, rank_for_use_in_first_group desc, population desc, distance asc
    limit 0, 11

编辑:改进