【发布时间】:2015-08-10 13:06:41
【问题描述】:
全部。 我有 2 个 mysql 表类型 myisam
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `users_ratings` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`created_date` varchar(255) DEFAULT NULL,
`user_id` mediumint(9) DEFAULT NULL,
`rating1` mediumint(9) DEFAULT NULL,
`rating2` mediumint(9) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
转储可以下载here
我希望所有用户按 rating2 选择和排序列表, rating2 必须 > 1000
SELECT * FROM users as u
INNER JOIN (SELECT rating2, user_id,MAX(created_date) as maxdate FROM `users_ratings` GROUP BY user_id) as x ON x.user_id = u.id
INNER JOIN users_ratings as ur ON(ur.created_date = x.maxdate and ur.user_id = u.id)
WHERE x.rating2 > 1000
ORDER by ur.rating2
如果没有这样的索引,查询会执行 9 秒。
所有可能的代码,我认为可以将请求时间减少到 1-2 秒。
帮助放置索引的权利
【问题讨论】:
-
一般来说,在聚合查询中,如果您选择一个未聚合的列,那么您还需要将它包含在您的 GROUP BY 子句中。 MySQL 可以原谅这一遗漏(其他 RDBMS 不会),但可能会导致不可预测和令人困惑的结果。
-
sqlfiddle 比从谷歌驱动器下载更好的设置供人们查看
-
您的问题不清楚。例如,
created_date与什么有关?最高评分就够了吗? -
我想获得最新的(最大(created_date))rating1 和 rating2 的用户。数据库保持用户评分的动态变化。
-
@Drew Пока что не имею опыта рыботы с sqlfiddle, но в будущем научусь, спасибо!
标签: mysql sql optimization database-indexes filesort