2013-03-07 87 views
0

我試圖優化我的索引以進行JOIN,然後GROUP BY來自連接表中的一列。MySQL:按加入列分組的索引

我通過運行下面的腳本測試,玩索引,但我似乎無法弄清楚我需要第三個查詢的索引。

求助:添加虛擬數據會使sql的行爲有所不同,我之前嘗試過的其中一個索引工作得很好!

CREATE DATABASE stats_idx_test; 

USE stats_idx_test; 

DROP TABLE stats; 
CREATE TABLE stats (article_id INT, cnt INT, type INT); 
ALTER TABLE stats ADD INDEX idxs1 (article_id, cnt, type); 

DROP TABLE article; 
CREATE TABLE article (id INT, cat_id INT); 
ALTER TABLE article ADD INDEX idxa2 (cat_id, id); 

INSERT INTO article (id, cat_id) VALUES (1, 1); 
INSERT INTO stats (article_id, cnt, type) VALUES (1, 9, 1); 
INSERT INTO stats (article_id, cnt, type) VALUES (1, 13, 2); 

EXPLAIN 
SELECT SUM(stats.cnt) 
FROM stats 
WHERE stats.type = 1 AND stats.article_id = 1; 
-- Using where; Using index 

EXPLAIN 
SELECT article.cat_id, SUM(stats.cnt) 
FROM stats 
JOIN article ON (stats.article_id = article.id) 
WHERE stats.type = 1 AND article.cat_id = 1; 
-- Using where; Using index 

EXPLAIN 
SELECT article.cat_id, SUM(stats.cnt) 
FROM stats 
JOIN article ON (stats.article_id = article.id) 
WHERE stats.type = 1 
GROUP BY article.cat_id; 
-- Using index 
-- Using where; Using index 
+0

實際的問題是什麼?你我沒有遇到問題,因爲你沒有把'stats.article_id = article.id'作爲'stats.article_id = article.article.id'的範圍' – 2013-03-07 17:48:43

+0

問題在於對於stats表它使用'idx2'但仍然有'在哪裏使用;使用索引;使用臨時;使用filesort' – 2013-03-08 08:19:49

回答

0

添加虛擬數據會使sql的行爲有所不同,我之前嘗試的其中一個索引工作得很好!

0

對於您所在的組,您需要cat_id上的索引。您擁有的當前索引無法應用。

Group by and indexing

你也應該考慮ID的主鍵。

+0

我暫時忽略了PK,因爲它是無關緊要的,儘管我明白它可以幫助其他一些目前不在我的測試場景中的JOIN。 – 2013-03-08 08:20:31

+0

我添加了'ALTER TABLE文章ADD INDEX idx4(cat_id);'但這並沒有幫助,它需要成爲一個多列idx我認爲 – 2013-03-08 08:21:14