1

我正在尝试在这里查询两个相当大的表以获取一些结果并遇到一些效率问题。

注意:我只包含了相关的列,以使这看起来不那么凌乱!

TableA (Stock) 具有 productID、ownerID 和 count 列

TableB(所有者)具有 ID、accountHolderID 和 name 列

我想要做的是查询 TableA 并且 productID = X 拉起 Stock.productID、Stock.accountHolderID 和 Owners.name。这两个表之间的关系是 Stock.ownerID = Owners.ID 所以如果 WHERE 条件拉说五个产品 ID,那么我希望 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

我怎样才能使这个查询更有效率?

将 OR 添加到 WHERE 条件是否允许我一次提取多个产品 ID?

4

3 回答 3

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)
于 2012-10-16T01:20:40.853 回答
1

根据您的评论,您似乎在 owner.id 字段上缺少一个非常关键的索引。现在,请记住此索引将有助于此查询,但您必须考虑针对此表运行的所有其他查询,以确定添加该索引是否是一个好主意。

在 29M 行时,对经常插入的表有一个索引可能会对插入时间产生显着影响。

这可能是不同应用程序需要不同索引的情况 - 即您的 OLTP 应用程序和您的报告应用程序(可能只是您运行临时查询)。一个常见的解决方案是让第二台服务器运行您的报告/数据仓库查询,该服务器的索引已正确调整到此功能。

祝你好运。

于 2012-10-16T01:45:33.577 回答
1

如果 productID 在 Stock 表中是唯一的,则将其设为索引是有意义的,这可以大大提高性能,正如其他人所提到的。

另一个性能提升来自设置特定长度的 Owner.name 字段。在 mySQL 中,VARCHAR 可用于不同长度的字符串,而 CHAR(32) 列表示名称将始终占用 32 个字符。多余的未使用空间只是被填充了,所以你真的可以认为 (32) 表示最大长度。性能优势来自这样一个事实,即数据库现在确切地知道每行占用多少字节,并且可以使用此信息来缩短查找时间。

于 2012-10-16T02:10:57.120 回答