【发布时间】:2014-06-18 10:41:02
【问题描述】:
我有两张桌子。 uploads 和 profits。
上传:
╔════╦══════════════╦══════════════════╗
║ id ║ name ║ more columns... ║
╠════╬══════════════╬══════════════════╣
║ 1 ║ Jeff Atwood ║ ................ ║
║ 2 ║ Geoff Dalgas ║ ................ ║
║ 3 ║ Jarrod Dixon ║ ................ ║
║ 4 ║ Joel Spolsky ║ ................ ║
╚════╩══════════════╩══════════════════╝
利润:
╔══════════╦══════════════╦══════════════════╗
║ uploadid ║ amount ║ more columns... ║
╠══════════╬══════════════╬══════════════════╣
║ 1 ║ 4.0 ║ ................ ║
║ 1 ║ 7.2 ║ ................ ║
║ 3 ║ 6.3 ║ ................ ║
║ 4 ║ 2.5 ║ ................ ║
╚══════════╩══════════════╩══════════════════╝
如您所见,uploads.id => profits.uploadid
我想显示uploads 表中的一些行,再加一列告诉我有多少“利润”。
结果示例:
╔════╦══════════════╦════════════════╦══════════════════╗
║ id ║ name ║ profitsCount ║ more columns... ║
╠════╬══════════════╬════════════════╬══════════════════╣
║ 1 ║ Jeff Atwood ║ 2 ║ ................ ║
║ 2 ║ Geoff Dalgas ║ 0 ║ ................ ║
║ 3 ║ Jarrod Dixon ║ 1 ║ ................ ║
║ 4 ║ Joel Spolsky ║ 1 ║ ................ ║
╚════╩══════════════╩════════════════╩══════════════════╝
注意:在实际表中,uploads.id 和 profits.uploadid 列是 varchar 而不是 int,我在这里用 int 做的更清楚。
问题在于,当我使用大型表(数千行)运行查询时,它需要 大量时间
我的查询:
SELECT `uploads`.* ,COUNT(`profits`.`uploadid`) AS `numProfits`
FROM `uploads`
LEFT JOIN `profits`
ON `uploads`.`id` = `profits`.`uploadid`
GROUP BY `uploads`.`id`
ORDER BY `numProfits`
DESC
LIMIT 30
【问题讨论】:
-
你的表有索引吗?
-
并且顺便说一句,当您仅按单列分组时,MySQL 允许选择完整的记录——但这在 IMO 中是非常错误的。 :)
-
@juergend
id列是主列。id的示例:OQl1iYdWF -
和
uploadid也被编入索引?
标签: mysql sql performance select sql-order-by