Sql 是从多个表中进行多次选择更好,还是从所有表中选择一个数据更好?
我有多个表,可以通过连接查询数据 关于数据库性能: 我应该从多个表中为所需数据运行多个选择吗 或 我是否应该编写一个select,它使用一组连接一次从所有表中选择所需的数据 编辑: 我将用于select的where子句包含表的索引字段。因此,使用1个select语句和多个联接会更快。不过,我仍将测试这两种方法之间的性能差异Sql 是从多个表中进行多次选择更好,还是从所有表中选择一个数据更好?,sql,sql-server,Sql,Sql Server,我有多个表,可以通过连接查询数据 关于数据库性能: 我应该从多个表中为所需数据运行多个选择吗 或 我是否应该编写一个select,它使用一组连接一次从所有表中选择所需的数据 编辑: 我将用于select的where子句包含表的索引字段。因此,使用1个select语句和多个联接会更快。不过,我仍将测试这两种方法之间的性能差异 感谢所有的好答案。这可能是其中之一,这要看情况而定,但通常情况下,如果您编写的是直接SQL,请执行一个查询,尤其是因为连接可能会限制返回的一些数据 如果对每个表中的一条记录执
感谢所有的好答案。这可能是其中之一,这要看情况而定,但通常情况下,如果您编写的是直接SQL,请执行一个查询,尤其是因为连接可能会限制返回的一些数据
如果对每个表中的一条记录执行多点查询,则很有可能,如果使用表的主键进行查找,则每个查询的连接成本将比实际查询的成本更高。这取决于表的连接方式。如果对所有表进行叉积,则最好进行单个选择。但是,如果表被正确地索引并经过深思熟虑,一个查询和多个选择将更有效 只需编写一个带有连接的查询。如果您关心性能,有许多选择,包括:
- 创建有助于提高所选内容性能的索引
- 创建所需数据的持久化非规范化形式,以便可以查询一个表。这很可能是一个索引视图或另一个表
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子句中的显示方式无关——它们将解析查询并优化要使用的最佳索引。