MySQL:在连接列上分组的索引

时间:2013-03-07 17:45:01

标签: mysql join group-by indexing explain

我正在尝试优化我的索引以进行JOIN,然后对来自连接表的其中一列进行GROUP BY。

我正在通过运行下面的脚本进行测试,使用索引,但我似乎无法弄清楚第三个查询需要哪些索引。

已解决:添加虚拟数据会导致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

2 个答案:

答案 0 :(得分:0)

对于该组,您需要一个cat_id索引。您拥有的当前索引无法应用。

Group by and indexing

此外,您应该考虑将ID设为主键。

答案 1 :(得分:0)

添加虚拟数据会使sql行为不同,我之前尝试的其中一个索引工作正常!