我有一个查询:
SELECT cl.title, cl.URL, cl.ID AS ad_id, cl.cat_id, cl.price, cs.name AS cat_name, pix.file_name, area.area_name
FROM classifieds cl
FORCE INDEX (advertiser_id)
INNER JOIN classifieds_pix pix ON cl.ID = pix.classified_id
INNER JOIN cat_names_sub cs ON cl.cat_id = cs.ID
INNER JOIN zip_codes zip ON cl.zip_id = zip.zip_id
INNER JOIN area_names area ON zip.area_id = area.id
WHERE cl.confirmed = 1 AND cl.price != '' AND cl.country = 'de'
GROUP BY cl.advertiser_id
ORDER BY cl.timestamp DESC
LIMIT 5
当classifieds包含168k行时,需要> 1秒的时间,这太长了。使用“FORCE INDEX(advertiser_id)”让我在没有“ORDER BY”子句的情况下将其降至0.00x秒。timestamp列也被索引,我尝试添加“FORCE INDEX(timestamp)”,但它没有起作用。
EXPLAIN显示,在classifieds表的第一个SELECT上,“Using where; Using temporary; Using filesort” - 这显然会导致性能问题。
你能帮我解决这个问题吗?
提前感谢!
PS:此查询的目的是获取5个最新的分类广告(包括一些附加信息,如图片、类别、邮政编码和区域名称)。此外,每位广告主只能显示一个分类广告。这很难吗?
PPS:我尽可能地锁定了问题,并最终得到了这个查询。
SELECT cl.title
FROM classifieds cl
GROUP BY cl.advertiser_id
ORDER BY cl.timestamp DESC
LIMIT 5
原本需要23秒才能完成!但是使用FORCE INDEX (advertiser_id)
后,只需要1秒钟即可完成。如果我移除GROUP BY或者ORDER BY中的任意一个,时间将缩短至0.0003秒。
我的表格/索引可能有什么问题吗?我不应该需要FORCE INDEX
(顺带提一下:USE INDEX
不起作用 - 我必须强制使用它!)并且不应该需要那么长的时间!
GROUP BY
确保只选择每个广告主的一个分类。 - eflorico