用于慢速MySQL查询的索引

用于慢速MySQL查询的索引,mysql,indexing,Mysql,Indexing,我有一个包含用户投票的大表。我尝试了几乎所有关于索引使用的教程和文章,但失败后。。。所有可能的字段组合都作为键,但查询速度较慢 有没有什么索引可以用来加快速度 (到目前为止,我不会再让你看到我在印度的可怕尝试…) 该表约有130万行,并将继续增长。这是我正在尝试的查询: EXPLAIN SELECT objectId, COUNT(uid) AS voteCount, AVG(vote) AS rating FROM votes GROUP BY objectId 有指针吗?我看不出索引有助于

我有一个包含用户投票的大表。我尝试了几乎所有关于索引使用的教程和文章,但失败后。。。所有可能的字段组合都作为键,但查询速度较慢

有没有什么索引可以用来加快速度

(到目前为止,我不会再让你看到我在印度的可怕尝试…)

该表约有130万行,并将继续增长。这是我正在尝试的查询:

EXPLAIN SELECT objectId, COUNT(uid) AS voteCount, AVG(vote) AS rating
FROM votes
GROUP BY objectId

有指针吗?

我看不出索引有助于加快速度,因为平均值函数要求您与每一行交互。没有WHERE子句


也许您可以创建一个视图,为您分摊成本。

我不认为索引有助于加快速度,因为平均值函数需要您与每一行交互。没有WHERE子句


也许您可以创建一个视图,为您分摊成本。

我认为达菲莫是正确的。但是,您可以尝试交换唯一键中的两列(或仅为objectid添加索引),因为这可能有助于分组。

我认为duffymo是正确的。但是,您可以尝试交换unique键中的两列(或仅为objectid添加索引),因为这可能有助于分组。

我建议的唯一方法是以下方法,尽管我不知道这是否会提高性能。它假设您有一个
对象
表,每个
对象ID有一行

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;
然后您需要以下索引:
投票(objectid,vote)


这将用索引扫描取代外部
组,这可能会加快查询速度。

我可以建议的唯一方法是以下方法,尽管我不知道这是否会提高性能。它假设您有一个
对象
表,每个
对象ID有一行

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;
然后您需要以下索引:
投票(objectid,vote)


这将用索引扫描取代外部的
组,这可能会加快查询速度。

我注意到它正在使用
objectId
上的索引,但只有当我省略了
投票的任何聚合时,无论我使用什么聚合。太糟糕了,达菲莫是对的,它总是需要做一个完整的表扫描来完成聚合(我怀疑计数只是在索引上进行的)。我注意到它正在使用
objectId
上的索引,但只有当我忽略了
投票的任何聚合时,不管我使用的是什么聚合。太糟糕了,duffymo是对的,它总是需要做一次完整的表扫描来完成聚合(我怀疑计数只是在索引上进行的)。我会尝试那种视图想法。我会尝试那种视图想法。没错,我忘记了示例SQL中的objectId。。。修正了你确定优化器使用这两个子查询会比使用一个group by更快吗?@ToBe。不,我说值得一试。在某些情况下,这可能会有所帮助,但我不知道它在您的情况下是否会更好。我更喜欢显式的
分组方法,但有时你必须尝试欺骗引擎。它要快得多!从约3分钟降至约5秒。是的,我在示例SQL中忘记了objectId。。。修正了你确定优化器使用这两个子查询会比使用一个group by更快吗?@ToBe。不,我说值得一试。在某些情况下,这可能会有所帮助,但我不知道它在您的情况下是否会更好。我更喜欢显式的
分组方法,但有时你必须尝试欺骗引擎。它要快得多!从约3分钟降至约5秒。Tnx