2015-12-31 66 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個條目之後全部刪除。但是按功能分組會逐一列出表格中的所有條目,然後限制它們。