2011-11-28 92 views
1

我提出以下查询在我applicattion,检索行:Mysql的减法低性能

SELECT 
    title, 
    SUBSTRING(description, 1, 200) AS s_description, 
    refresh_time, (UNIX_TIMESTAMP()-refresh_time) AS since, 
    state, state_friendly, 
    city, city_friendly, 
    category, category_friendly, 
    basename, COUNT(ad_id) AS im_ocur 
FROM `ad` `a` 
JOIN `state` ON state_id = ad_state_id 
JOIN `city` ON city_id = ad_city_id 
JOIN `category` ON category_id = ad_category_id 
LEFT JOIN `ad_image` ON ad_image_ad_id = ad_id 
WHERE (ad_country_id = 195) 
GROUP BY `ad_id` 
ORDER BY `refresh_time` DESC, front DESC 
LIMIT 20 

我已经在许多情况下测试,但指的是一个城市,有很多行的时候,表现它已经降低。经过几次更改后,我意识到问题是由于“(UNIX_TIMESTAMP() - refresh_time)”表达式造成的,所以似乎Mysql Engine在行限制设置为20之前进行算术运算。

我的替代解决方案是post-用PHP处理数据,但我更喜欢完整的mysql方式。

可能吗?

+0

与使用数学函数的返回列没有任何关系,只是由许多行上的GORUP BY造成的。 – ajreal

+0

但是,当我删除该表达式时,尽管使用GROUP BY –

+0

,但性能仍然非常出色您是否尝试对此查询使用EXPLAIN? – Oyeme

回答

0

我认为这不是一个减法,而是为每一行调用UNIX_TIMESTAMP()(虽然我可能是错误的)。

如果您认为减法是性能低下的原因,您可以随时将其移至外部查询。

SELECT 
    title, 
    s_description, 
    refresh_time, (UNIX_TIMESTAMP()-refresh_time) AS since, 
    state, state_friendly, 
    city, city_friendly, 
    category, category_friendly, 
    basename, im_ocur 
FROM (
    SELECT 
    title, 
    SUBSTRING(description, 1, 200) AS s_description, 
    refresh_time, 
    state, state_friendly, 
    city, city_friendly, 
    category, category_friendly, 
    basename, COUNT(ad_id) AS im_ocur 
    FROM `ad` `a` 
    JOIN `state` ON state_id = ad_state_id 
    JOIN `city` ON city_id = ad_city_id 
    JOIN `category` ON category_id = ad_category_id 
    LEFT JOIN `ad_image` ON ad_image_ad_id = ad_id 
    WHERE (ad_country_id = 195) 
    GROUP BY `ad_id` 
    ORDER BY `refresh_time` DESC, front DESC 
    LIMIT 20 
) AS sq