我有一张用户投票的大表。我尝试了几乎所有关于INDEX使用的教程和论文,并且在失败之后...将每个可能的字段组合作为键,但查询仍然很慢。
我可以使用任何索引加快速度吗?
(到目前为止,我将饶恕你对目标的无害尝试......)
CREATE TABLE IF NOT EXISTS `votes` (
`uid` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`objectId` bigint(15) NOT NULL,
`vote` tinyint(1) NOT NULL,
`created` datetime NOT NULL,
UNIQUE KEY `unique input` (`uid`,`objectId`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
该表有大约130万行,并将继续增长。这是我正在尝试的查询:
EXPLAIN SELECT objectId, COUNT(uid) AS voteCount, AVG(vote) AS rating
FROM votes
GROUP BY objectId
任何指针?
答案 0 :(得分:2)
我可以建议的唯一方法是以下,但我不知道它是否会提高性能。它假定您有一个Objects
表,每ObjectId
行一行:
SELECT ObjectId,
(select count(*) from votes v where v.objectid = o.objectid) as votecount,
(select avg(vote) from votes v where v.objectid = o.objectid) as rating
FROM objects o;
然后您需要以下索引:votes(objectid, vote)
。
这将使用索引扫描替换外部group by
,这可能会加快查询速度。
答案 1 :(得分:1)
我不知道索引如何有助于加快速度,因为平均功能需要您与每一行进行交互。没有WHERE子句。
也许你可以创建一个VIEW来为你分摊成本。
答案 2 :(得分:1)
我认为duffymo是正确的。但是,您可以尝试在您的唯一键中交换两列(或仅为objectid添加索引),因为它可能帮助GROUP BY。