mysql的多表,多列组由

  • 本文关键字:mysql mysql performance
  • 更新时间 :
  • 英文 :


我配置的表如下:

TABLE CAT{
ID number primary key,
CATNAME varchar2,
...
}
<Many-to-Many>
TABLE CAT_CHARR{
CATID number,
CHARRID number
}
TABLE CHARR{
ID number,
CHARRNAME varchar2,
SPECIES varchar2,
...
}

猫有自己的特征,这些特征被认为是该物种独有的特征。


INSERT INTO CHARR(CHARRNAME, SPECIES) VALUES ( 'BLUE FUR', 'russianblue');
INSERT INTO CHARR(CHARRNAME, SPECIES) VALUES ( 'NO FUR', 'sphinx');
...

可以按如下方式复制。

INSERT INTO CAT_CHARR(CATID, CHARRID) VALUES (1, 1);
INSERT INTO CAT_CHARR(CATID, CHARRID) VALUES (1, 1);
INSERT INTO CAT_CHARR(CATID, CHARRID) VALUES (1, 2);
INSERT INTO CAT_CHARR(CATID, CHARRID) VALUES (1, 3);

我只想计算每种猫的最高特征。

SELECT CAT.ID, CHARR.SPECIES, CHARR.CHARRNAME, COUNT(*) AS CNT
FROM CAT
INNER CAT_CHARR ON CAT.ID = CAT_CHARR.CATID
INNER JOIN CHARR ON CHARR.ID = CAT_CHARR.CHARRID
GROUP BY CAT.ID, CHARR.SPECIES, CHARR.CHARRNAME

如果没有group by,则速度快。但是如果有group by和count(*),则速度太慢。

我用谷歌翻译,所以解释可能有点奇怪。如果你写评论,我会更努力地翻译。抱歉

INNER JOIN操作成本高,可以替换此操作。你会得到像这样的

SELECT CAT.ID, CHARR.SPECIES, CHARR.CHARRNAME, COUNT(*) AS CNT
FROM CAT, CAT_CHARR, CHARR
WHERE CAT.ID = CAT_CHARR.CATID AND CHARR.ID = CAT_CHARR.CHARRID AND CHARR.ID = CAT.ID
GROUP BY CAT.ID, CHARR.SPECIES, CHARR.CHARRNAME

对于性能来说,多对多表需要

PRIMARY KEY(catid, carrid),
INDEX(carrid, catid)

(反之亦然)

最新更新