0

这是困扰我的问题:使用 1 个或 2 个查询是否更优雅(处理的数据量与查询数量)。

让我们使用以下虚假结构:

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

后跟 1 个查询以获取详细视图

SELECT * FROM myobj WHERE id=[id_provided]

或者

共 1 个查询

SELECT * FROM myobj

然后当结果集的当前行的id与http请求中提供的id匹配时,将详细视图的值保存在PHP中?

我相信 2 个查询更优雅,但我想知道它在处理时间方面的效率如何(多个数据库连接与包含无用数据的大量结果集)?

4

4 回答 4

3

我认为这真的取决于很多事情,行数和它们的大小。

两次调用有很大的开销。但取决于额外数据的大小,可能会或可能不会比描述字段的大小产生更大的影响。如果没有“文本”描述字段,那么一个调用显然会更快。

但你说这是假的——所以谁能说出你的实际查询。

于 2013-02-27T16:45:23.787 回答
1

这取决于您需要多少数据。

通常 - 更少的查询更好。

可以说,有“主”表和“详细”表。

如果您有 100 个“主”行 - 您将需要 100 个查询来获取它们的“详细信息”。

在这种情况下 - 我通过连接获取所有数据,然后我构建类似树结构(数组)的东西以使用“foreach”循环显示它。

于 2013-02-27T16:46:28.883 回答
1

这是一个用户界面问题。是不是要先渲染三列再获取细节?如果是这样,那么您希望最小化渲染时间。这表示使用两个查询。更简单的查询应该稍微快一些,因为它返回的数据更少。

如果您要在任何人看到它们之前输入所有详细信息,那么请使用第二种形式。这似乎不太可能。

更重要的是,我认为*在这种查询中使用是不好的做法。您应该明确包括两个查询的列列表。

于 2013-02-27T17:12:00.207 回答
0

让我们看看这个。您对列表视图的第一个建议是

   SELECT name, color, price FROM myobj

这将是一次全表扫描,和 a 一样,SELECT * FROM myOBJ 也就是说,它是 o(n)

接下来,你有SELECT * FROM myobj WHERE id=[id_provided] 由于这个字段(id)被索引,它的复杂性是恒定的。它会立即检索该行。

但是,看起来您将显示所有项目的详细信息,并且我假设您将遍历所有行并获取每个行的详细信息。对 n 条记录的持续检索将是 O(n)。

如果您要获取所有记录的详细信息,为什么不只获取select *一次呢?

于 2013-02-27T16:47:20.670 回答