我有这个查询:

select
b.user as user1, b.timestamp as ts1,
c.user as user2, c.timestamp as ts2,
d.user as user3, d.timestamp as ts3,
e.user as user4, e.timestamp as ts4,
f.user as user5, f.timestamp as ts5,
g.user as user6, g.timestamp as ts6,
h.user as user7, h.timestamp as ts7,
i.user as user8, i.timestamp as ts8,
j.user as user9, j.timestamp as ts9,
k.user as user10, k.timestamp as ts10,

a.beschreibung, a.auftragsnummer, a.faellig, a.subkunde,
(SELECT firma from kunden where id=a.kunde limit 0,1) as kunde,
(SELECT kommision from kommision where id=a.kommision limit 0,1) as kommision
 from auftrag a
  left join details b on (b.beschreibung='Step1' AND b.auftrags_id=a.id)
  left join details c on (c.beschreibung='Step2' AND c.auftrags_id=a.id)
  left join details d on (d.beschreibung='Step3' AND d.auftrags_id=a.id)
  left join details e on (e.beschreibung='Step4' AND e.auftrags_id=a.id)
  left join details f on (f.beschreibung='Step5' AND f.auftrags_id=a.id)
  left join details g on (g.beschreibung='Step6' AND g.auftrags_id=a.id)
  left join details h on (h.beschreibung='Step7' AND h.auftrags_id=a.id)
  left join details i on (i.beschreibung='Step8' AND i.auftrags_id=a.id)
  left join details j on (j.beschreibung='Step9' AND j.auftrags_id=a.id)
  left join details k on (k.beschreibung='Step10' AND k.auftrags_id=a.id)



where a.erledigt='1'


它运行非常非常慢,大约需要1分钟才能获得结果集。
表“ auftrag”具有820行,表“详细信息”约有7000行。
我究竟做错了什么?

谢谢
帕特里克

CREATE TABLE auftrag
(
    id INT(10) NOT NULL AUTO_INCREMENT,
    beschreibung VARCHAR(255) NULL DEFAULT '0',
    auftragsnummer VARCHAR(50) NULL DEFAULT '0',
    faellig VARCHAR(50) NULL DEFAULT NULL,
    kunde INT(11) NULL DEFAULT NULL,
    subkunde VARCHAR(50) NULL DEFAULT NULL,
    kommision VARCHAR(50) NULL DEFAULT NULL,
    notiz TEXT NULL,
    werbeanbringung TEXT NULL,
    erledigt INT(1) NULL DEFAULT NULL,
    INDEX Schlüssel 1 (id),
    INDEX Schlüssel 2 (id, auftragsnummer, kunde, subkunde, beschreibung)
) COLLATE='latin1_swedish_ci' ENGINE=MyISAM AUTO_INCREMENT=850 ;

CREATE TABLE details
(
    id INT(11) NOT NULL AUTO_INCREMENT,
    auftrags_id VARCHAR(50) NULL DEFAULT '0',
    beschreibung VARCHAR(50) NULL DEFAULT '0',
    user VARCHAR(50) NULL DEFAULT '0',
    timestamp VARCHAR(50) NULL DEFAULT '0',
    notiz VARCHAR(255) NULL DEFAULT NULL,
    INDEX Schlüssel 2 (user, timestamp, beschreibung, auftrags_id),
    INDEX Schlüssel 1 (id, user, timestamp, beschreibung)
) COLLATE='latin1_swedish_ci' ENGINE=MyISAM AUTO_INCREMENT=7260 ;

最佳答案

您的表上没有可用于此查询的索引,并且您正在反复将一个表与另一个表连接在一起。

在auftrag表上,在erledigt列上添加一个索引。

在详细信息表上,添加一个覆盖beschreibung和auftrags_id列的索引

如果您准备以后再处理返回的数据(即,将返回的字段拆分为数组),则也有可能避免大多数联接。但是有点混乱:

SELECT
    GROUP_CONCAT(CONCAT_WS('##', b.beschreibung, b.user, b.timestamp)),
    a.beschreibung, a.auftragsnummer, a.faellig, a.subkunde,
    (SELECT firma from kunden where id=a.kunde limit 0,1) as kunde,
    (SELECT kommision from kommision where id=a.kommision limit 0,1) as kommision
FROM auftrag a
LEFT OUTER JOIN details b on b.auftrags_id=a.id AND b.beschreibung IN ('Step1', 'Step2', 'Step3', 'Step4', 'Step5', 'Step6', 'Step7', 'Step8', 'Step9', 'Step10')
WHERE a.erledigt='1'
GROUP BY a.id


编辑-我刚刚注意到auftrag表上的id是一个INT字段(正如我期望的那样),但详细信息表上的auftrags_id列是VARCHAR(50)字段。这将极大地影响性能,因为它需要转换每个比较的值。

请注意,上面的Gordons注释确实适用于索引上字段的顺序(多少取决于实际数据,例如beschreibung还有多少其他值),但是没有解决由于不匹配的数据类型更改了索引而导致的问题。索引几乎肯定没有帮助。

关于mysql - MySQL与JOINS非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32223798/

10-13 02:53