2015-12-31 73 views
2

我有一个MySQL(MariaDB,更精确)的数据库,它包含不同的“记录”(不要与数据库记录混淆,这些是我的系统使用的数据单位,由多个键值字段组成)。 每个“记录”是“实例”的一部分。 每个“实例是一个的一部分‘用户组记录‘可以是一部分‘类别’由于使用了错误的INDEX导致的GROUP BY BY查询速度慢

我想写检索所有类别的用户组的SQL查询’ 每一个。’ - 和检索。中存在的所有实例每个类别下的记录量 我的SQL语句是这样的:

SELECT COUNT(r.id) AS records_number, c.category 
FROM records r 
INNER JOIN feeds_instances i ON r.instance = i.id 
INNER JOIN feeds_instances_categories c ON c.instance = i.id 
WHERE i.user_group = '0' 
AND r.reviewed IS NULL 
GROUP BY c.category 
LIMIT 0 , 30 

当测试与SQL_NO_CACHE查询,我得到了0.2+秒查询时取出GROUP BY,它减少到0.0008秒 当我对SQL查询执行EXPLAIN命令时,得到用于表c的索引是“实例”而不是“categor y“(feeds_instances_categories表有三列:id,instance,category。指标上实例)存在。

我想强制GROUP BY使用索引类别。我尝试使用USE INDEX命令,但我得到错误。我很可能没有正确地做,并且无法在文档中找到正确的方法。

任何帮助,将不胜感激!

+0

我删除了SQL Server标记,因为它不支持“LIMIT”。 –

+0

会'选择{} yourFields从feeds_instances_categories℃的内部JOIN feeds_instances我ON i.id = c.instance INNER JOIN记录R ON r.instance = {i.id它的其余部分}'帮助吗? – Terminus

回答

1

MySQL是非常不愿意使用索引进行聚集,所以你可能不会成功,会有。

你应该确定你有正确的连接索引和查询中的过滤器。这可能是:records(instance, reviewed)feeds_instances(user_group, id)feeds_instances_categories(instance, category)

如果user_group被声明为数字,则放弃单引号。令人困惑的字符串和数字也会混淆优化器。

+1

添加记录(实例,审查)将查询时间从0.2+减少到0.02秒!谢谢! – Idan

0

多少项目你必须在你的数据库。

如果您在没有group by的情况下优先执行查询,LIMIT将在30个条目之后全部删除。但是按功能分组会逐一列出表格中的所有条目,然后限制它们。