慢速MySQL查询的索引

时间:2014-09-04 10:25:43

标签: mysql indexing

我有一张用户投票的大表。我尝试了几乎所有关于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

任何指针?

3 个答案:

答案 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。