我正在我的应用程序中进行以下查询,以检索行:
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 引擎似乎在行限制设置为 20 之前进行了算术运算。
我的替代解决方案是使用 PHP 对数据进行后处理,但我更喜欢完整的 mysql 方式。
这可能吗?
最佳答案
我认为这不是减法,而是为每一行调用 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
关于Mysql减法性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295272/