优化简单MySQL查询响应时间

优化简单MySQL查询响应时间,mysql,query-optimization,Mysql,Query Optimization,我在MySQL中有两个表。一个包含用户,另一个包含事务数据 我试图找出利润最高的前50名用户 CREATE TABLE IF NOT EXISTS `t_logs` ( `tid` int(11) NOT NULL AUTO_INCREMENT, `userid` int(11) NOT NULL, `amount` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`tid`) ) ENGINE=MyISAM DEFAULT CHARSET

我在MySQL中有两个表。一个包含用户,另一个包含事务数据

我试图找出利润最高的前50名用户

CREATE TABLE IF NOT EXISTS `t_logs` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) NOT NULL,
  `amount` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`tid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;


CREATE TABLE IF NOT EXISTS `t_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(100) NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
查询:

SELECT *, (SELECT SUM(amount) FROM `t_logs` WHERE userid=u.id LIMIT 0,1) AS profit
FROM `t_users` u
ORDER BY profit DESC
LIMIT 0,50
现在的问题是,如果我在t_users表中有1000个条目,在t_logs表中有3000个事务,那么这个查询在使用Apache和2GB RAM的VDS上需要25秒,或者在使用XAMPP的本地计算机上需要9秒(我有16GB的RAM)

问题是:我还能做些什么来优化这一切吗?也许把表引擎从MyISAM改成别的?或者我的询问无效?或者,唯一的解决方案是向VDS添加更多RAM


如果我们尝试添加10000个用户和10000个日志,查询在VDS上需要250秒。如果我希望有超过50000个用户和超过100万个日志,我的选项是什么?

您应该使用
左连接
分组方式
,而不是子查询,并且您需要
t_日志上的索引。userid

SELECT u.*, SUM(l.amount) AS profit
FROM t_users u
LEFT JOIN t_logs l
  ON l.userid = u.id
GROUP BY u.id
ORDER BY profit DESC
LIMIT 50

这将返回所有事务总和的1行,而不是根据前50名用户的利润返回50行。忘记了必须的
分组依据
。修正了。查询花费了0.1887秒抱歉,但Kim的查询速度要快得多。可能吧。您必须使用
SQL\u NO\u CACHE
来测试速度。如果我在每个表中添加10000行,并且使用具有2GB RAM的VDS,则响应将在7秒内返回,而不是250。这肯定是一个进步。我猜如果服务器上的RAM得到改善,那么性能也会得到改善。谢谢查询耗时0.0047秒
SELECT u.* , p.profit
FROM `t_users` u
LEFT JOIN (
  SELECT userid, SUM(amount) as profit FROM `t_logs` GROUP BY userid) AS p
ON p.userid=u.id 
ORDER BY p.profit DESC
LIMIT 0,50