-1

我需要进行一个查询,从各种表中获取列 - 总共 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”部分将根据用户想要搜索的内容而变化。

4

1 回答 1

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 的新列到 ss,其定义与 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

看看是否有帮助。我希望我把你引向了正确的方向!

于 2012-09-12T00:16:29.880 回答