优化简单MySQL查询响应时间
我在MySQL中有两个表。一个包含用户,另一个包含事务数据 我试图找出利润最高的前50名用户优化简单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
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