Sql 是从多个表中进行多次选择更好,还是从所有表中选择一个数据更好?

Sql 是从多个表中进行多次选择更好,还是从所有表中选择一个数据更好?,sql,sql-server,Sql,Sql Server,我有多个表,可以通过连接查询数据 关于数据库性能: 我应该从多个表中为所需数据运行多个选择吗 或 我是否应该编写一个select,它使用一组连接一次从所有表中选择所需的数据 编辑: 我将用于select的where子句包含表的索引字段。因此,使用1个select语句和多个联接会更快。不过,我仍将测试这两种方法之间的性能差异 感谢所有的好答案。这可能是其中之一,这要看情况而定,但通常情况下,如果您编写的是直接SQL,请执行一个查询,尤其是因为连接可能会限制返回的一些数据 如果对每个表中的一条记录执

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

关于数据库性能:

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

我是否应该编写一个select,它使用一组连接一次从所有表中选择所需的数据

编辑:

我将用于select的where子句包含表的索引字段。因此,使用1个select语句和多个联接会更快。不过,我仍将测试这两种方法之间的性能差异


感谢所有的好答案。

这可能是其中之一,这要看情况而定,但通常情况下,如果您编写的是直接SQL,请执行一个查询,尤其是因为连接可能会限制返回的一些数据


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

这取决于表的连接方式。如果对所有表进行叉积,则最好进行单个选择。但是,如果表被正确地索引并经过深思熟虑,一个查询和多个选择将更有效

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

  • 创建有助于提高所选内容性能的索引
  • 创建所需数据的持久化非规范化形式,以便可以查询一个表。这很可能是一个索引视图或另一个表

如果表上有适当的索引,使用联接可能会更好,但它们通常是瓶颈的原因。与多次选择不同的是,您可以研究如何对数据进行反规范化。当用户执行一个操作来更新多个表中的计数或时间戳时,它的“成本”要低得多,这可以防止您必须加入这些表

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

例如,sometable中有10000行:

SELECT id, name, description, status FROM sometable WHERE name LIKE '%someName%' AND status = 'Active';
您可以在查询之前键入EXPLAIN,它可能会返回10000作为扫描匹配的行数。然后创建一个复合索引:

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

然后再次对表执行“解释”,它可能会返回1,因为扫描的行数和性能显著提高。

取决于表的设计

大多数情况下,一个大型查询更好,但请确保

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

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


一般来说,我会使用一个
SELECT
语句。关系数据库非常擅长优化查询执行。如果有疑问,您可以随时分析这两种方法,并查看哪种性能更好。我从未分析过数据库。如何测试性能?这完全取决于您使用的数据库。例如,对于MS SQL Server,您可以在SQL Management Studio中检查查询执行计划,以获得查询每个步骤的详细分析。在MySQL中,您可以使用
EXPLAIN
关键字来分析查询执行计划。为了测试总体性能,您可以编写一个小型应用程序,该应用程序可以多次执行这两个选项,并获得每次执行的平均时间跨度。@David我使用的是MS SQL Server。谢谢您的解释。@Mausimo:在这种情况下,您有一个最伟大的开发人员调试工具可用于查询分析:)在SQL Management Studio中,当您打开一个新的查询窗口时,顶部的菜单项之一是“包含实际执行计划”(或Ctrl-M)。启用该功能,查看输出,并进入一个勇敢的SQL调试新世界:)当然,破坏规范化也有其缺点-您对事务的控制必须更加完善。此外,索引列顺序通常与它们在大多数现代DBMS的where子句中的显示方式无关——它们将解析查询并优化要使用的最佳索引。