【问题标题】:PHP PDO mySQL query - the most efficient methodPHP PDO mySQL 查询——最高效的方法
【发布时间】:2013-11-06 03:50:28
【问题描述】:

我有一个数据库,其中包含 4 个用于构建页面内容的关系表:

content    rel     theme     theme_meta  

rel 表将content 表中的contentIDtheme 表的相应rel 字段相匹配。 theme_meta 有一个名为 themeID 的字段将其链接到 theme 表。

所以

在构建页面时,我将内容表JOIN 连接到del 表,将其连接到theme 表和theme_meta 表。

它为content 表的每个匹配行提供了大约 24 行。

然后我使用一些 php foreach 循环将结果重组为每个 content 行的多维数组。

这样有效吗?对数据库进行 2 次调用会更快更高效吗,一次调用content,一次调用theme。这将产生更少的行并且更易于使用,但需要再次调用数据库。

【问题讨论】:

  • 您当前的方法(单个查询)通常是最好的方法。数据库查询会产生大量开销。
  • 行数更少?这两种方法应该导致总体上相同数量的行!?!?哦,还有 eggyal 说的 +1

标签: php mysql pdo lag


【解决方案1】:

如上所述,使用单个查询的方法通常是最好的方法(因为数据库查询会产生大量开销)。

确实,听起来您的替代方法会在每次调用其他查询(在其他表上)以获取连接数据时循环一个查询(在 content 表上)的结果:这种方法将从长远来看,成本非常高,而且不会很好地扩展。

因此,要从数据中组装一个多维数组,您只需对连接的结果进行相应的排序,并在遍历结果集时跟踪最后看到的标识符(以便检测何时需要遍历结果数组中的级别):

$qry = $dbh->query('
  SELECT   *
  FROM     content
      JOIN rel        USING (contentID)
      JOIN theme      USING (rel)
      JOIN theme_meta USING (themeID)
  ORDER BY contentID
');

$arr = array();

$row = $qry->fetch();
while ($row) {
  array_push($arr, array());
  $cid = $row['contentID'];
  do {
    array_push(end($arr), $row);
  } while ($row = $qry->fetch() and $row['contentID'] == $cid);
}

echo var_export($arr);

然而我要提醒的是,从数据库查询的结果构建这样一个 PHP 数据结构通常会产生不必要的成本,因为人们可能能够在读取结果集的同时构建和调度必要的输出。

【讨论】:

  • 谢谢。信息量很大,我用非常相似的方法来管理它。
猜你喜欢
  • 2013-10-08
  • 2016-01-12
  • 2015-09-01
  • 2011-04-08
  • 2011-09-03
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多