优化MYSQL(3)表连接查询

时间:2010-01-31 07:26:51

标签: php mysql

对我的一些查询测试运行EXPLAIN导致连接速度慢,即使是索引也是如此 如何使用以下信息更有效地进行MYSQL查询?

  
    

         

计数器: id(pk),timestamp,user_id(fk)
    用户: ID(PK),用户名,website_id(fk)
    网站: id(pk),网站名称

  
SELECT t2.username, t3.sitename, count(*) as views FROM counter t1
LEFT JOIN user t2 ON t2.id = t1.user_id
LEFT JOIN website t3 ON t3.id = t2.website_id
WHERE t1.id <> ""
GROUP BY t1.id
ORDER BY t1.id DESC 

html表中的结果:

  
    

用户名,网站名称,counter_views

  

3 个答案:

答案 0 :(得分:2)

不要count(*),而是使用count(t1.id)

问题编辑更改

通过编辑问题,您应该在count语句中添加一个列名,例如, count(user.id)

我相信sql是错误的。你不想要这个:

select u.username, s.sitename, count(c.id)
from user u
join website s on u.website_id = s.id
join counter c on u.id = c.user_id
where u.id <> ""
group by u.username, s.sitename
order by u.id desc

答案 1 :(得分:1)

您的数据是否已填充?如果这些表为空或非常小,优化器可能会选择“全部”查询,因为整个表位于一个页面上。从磁盘加载一页以获取整个表比在磁盘上为索引命中页面更快,然后是真实数据页的另一页。

答案 2 :(得分:0)

您的查询看起来不对。我会用这样的东西:

SELECT u.username, w.sitename, c.views
FROM (
  SELECT user_id, COUNT(*) AS views FROM counter GROUP BY user_id
) AS c
LEFT JOIN user u ON u.id = c.user_id
LEFT JOIN website w ON w.id = u.website_id
ORDER BY c.views DESC

我也会为counter.user_id添加索引。

相关问题