让我感到困扰的是:使用1个或2个查询是否更优雅(处理的数据量vs.查询数量)?
让我们使用以下伪结构:
CREATE TABLE myobj (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(64),
color varchar(64) DEFAULT NULL,
price float,
description text,
dateofcreation varchar(8) DEFAULT NULL
PRIMARY KEY (id)
)
我想显示一个包含记录列表(对象名称,颜色,价格)的页面
List (name, color, price)
apple, red, 5.00
brick, orange, 1.00
corn, yellow, 2.00
,如果定义了$_REQUEST['id']
,我希望显示所选id
最后一个问题:
对于列表视图使用1个查询是否更快
SELECT name, color, price FROM myobj
后面跟着一个查询详细视图
SELECT * FROM myobj WHERE id=[id_provided]
或
查询总数
SELECT * FROM myobj
,然后在PHP中保存详细视图的值,当结果集的当前行的id与http请求中提供的id匹配时?
我相信2查询更优雅,但我想知道它在处理时间方面的效率(多个db连接vs.包括无用数据在内的大量结果集)?
我认为这真的取决于很多东西,行数和它们的大小。
两个调用有很大的开销。但根据额外数据的大小,可能会或可能不会比描述字段的大小产生更大的影响。如果没有"text"描述字段,那么一个调用显然会更快。
但是你说这是假的——所以谁能说你的实际查询。
这取决于你需要多少数据。
一般来说,查询越少越好。
假设有"master"answers"detail"两个表
如果你有100个"主"行,你将需要100个查询来获取它们的"详细信息"。
在这样的情况下-我得到所有的数据与连接,然后我建立类似树形结构(数组)显示它与"foreach"循环
这是一个用户界面问题。您打算先渲染这三列,然后再获取细节吗?如果是这样,那么您希望最小化渲染时间。这就是说要使用两个查询。更简单的查询应该稍微快一些,因为它返回的数据更少。
如果你想在别人看到之前把所有的细节都写进去,那就用第二种形式。这似乎不大可能。
更重要的是,我认为在这类查询中使用*
是不好的做法。您应该显式地包括两个查询的列列表。
让我们看看这个。你对列表视图的第一个建议是
SELECT name, color, price FROM myobj
这将是一个全表扫描,就像SELECT * FROM myOBJ
一样也就是说,它是0 (n)
接下来,你有SELECT * FROM myobj WHERE id=[id_provided]
因为这个字段(id)是有索引的,所以它的复杂度是恒定的。它会立即检索那一行
然而,看起来您将显示所有项目的详细信息,并且我假设您将遍历所有行并获取每一行的详细信息。对于n条记录的常量检索将是O(n)。
如果你得到所有记录的细节,为什么不只是select *
一次?