我有一个网页,它有一个ID作为GET变量,我需要为这个ID (存储在一个表中)提取name、city和state以及与它相关的任何数据(存储在另一个表中)。
以下是一个查询的结果:
SELECT
info.name, info.city, info.state,
data.data1, data.data2, data.data3, data.data4
FROM
data_table data,
info_table info
WHERE
data.id = 12345 AND info.id = data.id
name | city | state | data1 | data2 | data3 | data4
---------------------------------------------------
test | temp | AL | 12 | 9 | 1 | 14
test | temp | AL | 63 | 8 | 1 | 6
test | temp | AL | 46 | 66 | 1 | 723
test | temp | AL | 7 | 5 | 2 | 99
test | temp | AL | 4 | 2 | 3 | 0
test | temp | AL | 2 | 11 | 1 | 1但是name、city、state的列数据对于每一行都是相同的,所以我也可以使用两个查询来完成它,并返回“正确”的数据量(但显然需要两倍的时间与服务器通信):
SELECT
info.name, info.city, info.state,
FROM
info_table info
WHERE
info.id = 12345
name | city | state
-------------------
test | temp | AL ...and...
SELECT
data.data1, data.data2, data.data3, data.data4
FROM
data_table data,
WHERE
data.id = 12345
data1 | data2 | data3 | data4
-----------------------------
12 | 9 | 1 | 14
63 | 8 | 1 | 6
46 | 66 | 1 | 723
7 | 5 | 2 | 99
4 | 2 | 3 | 0
2 | 11 | 1 | 1因此,一般来说,使用2个查询并返回我所需的确切数据量是否一定更好?或者,由于返回的数据集(小)大小,只需咬一口数据集--比它需要的数据更大--只运行一个查询?
我猜每种情况都是不同的,如果total server communication time / 2 > time to transmit extra data,那么一个查询更好?
发布于 2014-02-07 21:59:19
避免过早优化的缺陷,只需执行单个JOIN,而不是尝试在客户端执行JOIN操作。
如果后来发现重复的数据是一个很大的压力,那么除了执行多个查询之外,您还可以更好地解决这个问题。
例如,result sets can be compressed,减少重复数据的大小。压缩的CPU开销可能比尝试执行JOIN操作的客户端要少得多。
发布于 2014-02-07 21:55:29
对于一个小的结果集,如果冗余数据量不大,请使用一条语句。
“隐藏”成本之一(就MySQL服务器而言)是每个语句的开销。每个SQL语句都必须发送到服务器.MySQL必须解析并准备每条语句。MySQL必须检查语句在语法上是否正确(关键字、逗号等),语句在语义上是否正确,即标识符(表名、列名、函数名)是否有效,并且用户对所有对象都具有权限)。在此之后,MySQL可以生成一个执行计划,评估不同的访问路径(全表扫描与使用索引、连接顺序等)。
对于一个小的结果集,发送单个语句并返回几个冗余列将比处理两个单独的语句以及准备和返回两个独立的结果集更有效(就MySQL服务器而言)。
发送查询和检索结果集涉及到网络延迟。因此,两次这样做将超过只做一次的成本,并且在结果集中发送几百字节的冗余数据。
另一方面,如果冗余数据量很大,这将消耗内存和网络带宽,或者,如果查询的执行计划不如运行两个单独的查询那么有效.在这些情况下,运行两个单独的查询将更有效率。
发布于 2014-02-07 21:34:41
你应该考虑两个因素:
这完全取决于你的情况:
如果每个Id对应于数千行,则网络开销要高于建立2个连接的成本。因此,最好将其分解为2个查询。
如果每个Id对应于一个小数据集,则网络开销低于建立2个连接。所以,最好只使用一个查询。
对你的情况来说,你必须从经验上看哪个更快。
https://stackoverflow.com/questions/21637745
复制相似问题