2013-05-25 33 views
1

enter image description here你好所有下面的查询是非常慢我似乎无法优化它。Mysql组中的随机项目组

我试过两种方法。两者都非常缓慢。

我需要从每个image_tag中获取一个随机项目以及属于某个标签的图像数量。任何建议将不胜感激。询问两分钟执行任何一种方式。相对于图像数量和连接速度较慢。图像本身非常快。加入时很慢。

SELECT T.id, T.title, T.guid_id, T.hits, al.title, tt.title, tt.raw, it.tag_title_id 
,((ACOS(SIN(53.38946 * PI()/180) * SIN(geo.latitude * PI()/180) + COS(53.38946 * PI()/180) 
* COS(geo.latitude * PI()/180) * COS((-2.599586 - geo.longitude) * PI()/180)) * 180/PI()) * 60 * 1.1515) 
AS distance, uf.real_name, uf.user_name, itx.image_count 
FROM 
    (SELECT imx.id, imx.guid_id, imx.user_id, imx.approved, imx.hits, imx.title, imx.visible, imx.geolocation_id, imx.advertise_to 
     FROM image imx 
     ORDER BY floor(RAND()*(SELECT count(1) FROM image))) 
     AS T 
INNER JOIN image_tag it ON T.id = it.image_id 
INNER JOIN tag_title tt ON it.tag_title_id =tt.id 
INNER JOIN album_image ai ON T.id = ai.image_id 
INNER JOIN album al ON ai.album_id = al.id 
INNER JOIN user us ON T.user_id = us.id 
LEFT JOIN user_flickr uf ON us.flickr_id = uf.id 
LEFT JOIN user_site uss ON us.user_site_id= uss.id 
LEFT JOIN geolocation geo ON T.geolocation_id = geo.id 
LEFT JOIN (SELECT image_id, count(*) as image_count FROM image_tag GROUP BY image_id) itx ON itx.image_id = T.id 
WHERE T.visible = in_image_visible 
AND T.approved = in_image_approved 
AND (T.advertise_to <= in_date_time_now OR T.advertise_to IS NULL) 
GROUP BY tt.id; 

这是快速

SELECT * FROM (SELECT image_id, count(*) as image_count 
    FROM image_tag it 
    GROUP BY image_id) T 
INNER JOIN image im ON T.image_id = im.id 

当我添加的加入是非常缓慢的

+0

当您移除该三角函数时发生了什么性能? – Dancrumb

+0

非常缓慢的三角学没有性能影响它 –

+0

你可以通过'EXPLAIN'运行这个并提供结果吗? – Dancrumb

回答

0

主要的问题是,你在超过20000行有两个filesorts查询中的随机逻辑。

这意味着您正在排序而没有索引的好处,而索引的行数会很慢。

我建议你消灭随机排序......用你正在处理你的PHP结果的任何语言来做这件事。这将删除其中一个文件。如果这能让事情达到合理的水平,那么很好。

+0

我添加了随机排序从每个组中选择一个不同的项目 - 是否有任何其他方式来做到这一点 –

+0

基本上试图选择不同的项目每个组和数量每组图像 –

0

你可以尝试得到一个随机图像此方法:

SELECT imx.id, imx.guid_id, imx.user_id, imx.approved, imx.hits, imx.title, imx.visible, imx.geolocation_id, imx.advertise_to 
    FROM image imx 
    ORDER BY rand() 

额外的子查询不能帮助的事项。