4

我有多个可以通过连接查询数据的表。

关于数据库性能:

我应该从多个表中针对所需数据运行多个选择吗?

或者

我是否应该编写 1 个使用一堆连接的选择来一次从所有表中选择所需的数据?

编辑:

我将用于选择的 where 子句包含表的索引字段。听起来正因为如此,使用 1 条带有许多连接的 select 语句会更快。但是,我仍然会测试 2 之间的性能差异。

感谢所有伟大的答案。

4

5 回答 5

4

这可能是其中之一,很好,它取决于,但通常如果您正在编写直接 SQL 做一个查询 - 特别是因为连接可能会限制您返回的一些数据。

如果您对每个表中的一条记录执行多个点查询,则很有可能,如果您使用表的主键进行查找,则每个查询的连接成本将比实际查询的成本更高。

于 2012-07-23T17:32:52.287 回答
4

只需编写一个带有连接的查询。如果您担心性能,有多种选择,包括:

  • 创建有助于提高选择性能的索引
  • 创建所需数据的持久非规范化形式,以便您可以查询一个表。这很可能是一个索引视图或另一个表。
于 2012-07-23T17:34:18.517 回答
3

这取决于表的连接方式。如果您对所有表进行交叉乘积,则最好进行单独的选择。但是,如果您的表已正确编入索引并且经过深思熟虑,则一个带有多个选择的查询会更有效。

于 2012-07-23T17:34:08.273 回答
3

如果您的表上有适当的索引,则使用 JOIN 可能会更好,但它们通常是造成瓶颈的原因。您可能会寻找非规范化数据的方法,而不是多选。当用户执行操作以更新多个表中的计数或时间戳时,它的“成本”要低得多,这使您不必加入这些表。

我发现查询性能调优的最佳工具是使用 EXPLAIN。在查询之前键入 EXPLAIN,您可以看到扫描了多少行。您的目标是数字越低越好,这意味着您的索引正在工作。另一件事是在创建索引时,在多个字段上使用复合索引,并按照它们在 WHERE 子句中出现的顺序从左到右排列它们。

例如,您在某个表中有 10,000 行:

SELECT id, name, description, status FROM sometable WHERE name LIKE '%someName%' AND status = 'Active';

您可以在查询之前键入 EXPLAIN,它可能会返回 10,000 作为扫描匹配的行数。然后创建一个复合索引:

ALTER TABLE sometable ADD INDEX idx_st_search (name, status);

然后,您再次对表执行 EXPLAIN,它可能会在扫描的行数和性能显着提高时返回 1。

于 2012-07-23T17:37:57.287 回答
1

取决于您的表设计。

大多数时候,一个大查询更好,但一定要

  • 尽可能在 where 子句中使用主键进行连接。

  • 使用索引字段或为 where 子句中使用的字段创建索引。

于 2012-07-23T17:39:02.020 回答