我正在尝试在这里查询两个相当大的表来提取一些结果并且在效率方面遇到一些麻烦。
注意:我只包含相关列,以使其看起来不那么混乱!
TableA(股票)有productID,ownerID和count列
TableB(所有者)具有ID,accountHolderID和名称列
我要做的是查询TableA,其中productID = X拉起Stock.productID,Stock.accountHolderID和Owners.name。这两个表之间的关系是Stock.ownerID = Owners.ID,所以如果拉出的WHERE条件说五个productID,那么我希望TableB中的名称与TableA中的ownerID相匹配。
在这种情况下,唯一的唯一ID是来自TableB的Owners.ID
在TableA上为这些产品执行基本的SELECT查询需要15秒,但是当我添加INNER JOIN以匹配TableB时,查询需要更长时间,超过10分钟。我猜我没有低效地设计这个查询。
SELECT
Owners.name,
Stock.productID,
Stock.ownerID
FROM Stock
INNER JOIN
Owners
ON Stock.ownerID = Owners.ID
WHERE
Stock.productID = 42301679
如何提高此查询的效率?
将WH添加到WHERE条件是否允许我一次提取多个productID?
答案 0 :(得分:1)
你的查询看起来正确 也许我们可以看到架构
要一次提取多个产品ID,您可以使用IN
运算符代替OR
SELECT
Owners.name,
Stock.productID,
Stock.ownerID
FROM Stock
INNER JOIN
Owners
ON Stock.ownerID = Owners.ID
WHERE
Stock.productID IN (42301679,123232,232324)
答案 1 :(得分:1)
根据您的评论,您似乎错过了owner.id字段中非常关键的索引。现在,请记住,此索引将有助于此查询,但您必须考虑针对此表运行的所有其他查询,以确定添加该索引是否是一个好主意。
在29M行中,在频繁插入的表上具有索引可能会对插入时间产生明显影响。
这可能是不同应用程序需要不同索引的情况 - 即您的OLTP应用程序和报告应用程序(可能只是您运行即席查询)。一个常见的解决方案是让第二台服务器运行您的报告/数据仓库查询,其中索引已正确调整到此功能。
祝你好运。
答案 2 :(得分:1)
如果productID在Stock表中是唯一的,那么将其作为索引是有意义的,这可以像其他人提到的那样大大提高性能。
设置特定长度的Owner.name字段可以获得另一个性能提升。在mySQL中,VARCHAR可用于不同长度的字符串,而CHAR(32)列表示名称将始终占用32个字符。额外的未使用空间只是填充,因此您可以将(32)视为指示最大长度。性能优势来自于数据库现在确切知道每行占用多少字节,并且可以使用此信息来改善查找时间。