我需要创建一个查询,从各种表中获取列 - 总共5个表。我很高兴得到左连接的要点,并得到我需要的结果,唯一的问题是速度。我在索引/键上有点迷失,可能是因为我的案例对于我在线阅读的所有例子都不典型。我的表中的“唯一”id不是所有表中的主键,也不是因为该id可以在表中有多行(历史/审计目的)。在几个表(## / ###和## - ###)中,id也有不同的格式,因此匹配它们的函数可能会导致大的减速。到目前为止,粘贴我的代码可能更容易(只有3个表 - 在我可以先征服3之前不会全部执行!),有人可以建议如何使用索引和键进行改进。
SELECT dc.URN,dc.GuideName,dc.GuideStreet,ss.categorycalc,pm.initiatedate
FROM dc
LEFT JOIN pm
ON dc.URN = pm.URN
LEFT JOIN ss
ON dc.URN = replace(ss.URN,"/","-")
WHERE dc.GuidePCode LIKE 'WA9%'
ORDER BY pm.Status ASC;
我很欣赏只是简单地启动数据库并“正确执行”等的建议。 - 已经编写了许多程序以某些方式将数据插入某些表。因此,更改唯一ID的结构以及将其写入某些表的方式是非常不切实际的。我只需要专注于提取我已经获得的数据报告。 “WA9”部分将根据用户想要搜索的内容而改变。
答案 0 :(得分:2)
首先我会做一个解释。查看MySQL手册以了解正确用法,但基本上是:
EXPLAIN SELECT dc.URN,dc.GuideName,dc.GuideStreet,ss.categorycalc,pm.initiatedate
FROM dc
LEFT JOIN pm ON dc.URN = pm.URN
LEFT JOIN ss ON dc.URN = replace(ss.URN,"/","-")
WHERE dc.GuidePCode LIKE 'WA9%'
ORDER BY pm.Status ASC;
查看“关键”列。如果某个表的行为空,那么您可能需要在这些字段上使用索引。如果您还没有,我建议您添加以下内容:
(顺便说一句,首先在测试环境中运行它)
ALTER TABLE dc ADD INDEX URNIdx (URN);
ALTER TABLE pm ADD INDEX URNIdx (URN);
ALTER TABLE dc ADD INDEX GuidePCodeIdx (GuidePCode);
我想说尝试在表ss中添加一个索引,但我认为最好创建一个名为URNdashed的新列,其定义与URN的定义相同。然后运行此更新:
UPDATE ss SET URNdashed = replace(ss.URN, "/", "-");
还为URNdashed添加索引:
ALTER TABLE ss ADD INDEX URNdashedIdx (URNdashed);
然后改变你的:
ON dc.URN = replace(ss.URN,"/","-")
to
ON dc.URN = URNdashed
看看是否有帮助。我希望我朝着正确的方向熬你!