我有多个可以通过连接查询数据的表。
关于数据库性能:
我应该从多个表中针对所需数据运行多个选择吗?
或者
我是否应该编写 1 个使用一堆连接的选择来一次从所有表中选择所需的数据?
编辑:
我将用于选择的 where 子句包含表的索引字段。听起来正因为如此,使用 1 条带有许多连接的 select 语句会更快。但是,我仍然会测试 2 之间的性能差异。
感谢所有伟大的答案。
我有多个可以通过连接查询数据的表。
关于数据库性能:
我应该从多个表中针对所需数据运行多个选择吗?
或者
我是否应该编写 1 个使用一堆连接的选择来一次从所有表中选择所需的数据?
编辑:
我将用于选择的 where 子句包含表的索引字段。听起来正因为如此,使用 1 条带有许多连接的 select 语句会更快。但是,我仍然会测试 2 之间的性能差异。
感谢所有伟大的答案。
这可能是其中之一,很好,它取决于,但通常如果您正在编写直接 SQL 做一个查询 - 特别是因为连接可能会限制您返回的一些数据。
如果您对每个表中的一条记录执行多个点查询,则很有可能,如果您使用表的主键进行查找,则每个查询的连接成本将比实际查询的成本更高。
只需编写一个带有连接的查询。如果您担心性能,有多种选择,包括:
这取决于表的连接方式。如果您对所有表进行交叉乘积,则最好进行单独的选择。但是,如果您的表已正确编入索引并且经过深思熟虑,则一个带有多个选择的查询会更有效。
如果您的表上有适当的索引,则使用 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。
取决于您的表设计。
大多数时候,一个大查询更好,但一定要
尽可能在 where 子句中使用主键进行连接。
使用索引字段或为 where 子句中使用的字段创建索引。