我应该为列表和详细视图使用1或2个SQL查询吗?


Should I use 1 or 2 SQL queries for a list and a detailed view?

让我感到困扰的是:使用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 *一次?