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