【问题标题】:Optimize this SQL query优化此 SQL 查询
【发布时间】:2011-06-27 01:04:56
【问题描述】:

我在 foreach 循环中有一个 SQL 查询。有时可能有很多,我的意思是要执行很多查询,这取决于几个标准,可能多达 78 个查询。

现在,我知道过早的优化是万恶之源,但我不想看到 78 个查询 - 这不健康。

代码如下:

$crumbs = explode(",", $user['data']['depts']);

foreach ($crumbs as &$value) {
    $data = $db->query("SELECT id FROM tbl_depts WHERE id = '" . $value . "'");
    $crumb = $data->fetch_assoc();
    $dsn = $db->query("SELECT msg, datetime FROM tbl_motd WHERE deptid = '" . $value . "'");
    $motd = $dsn->fetch_assoc();
    if ($motd['msg'] != "") {
        <?php echo $motd['msg']; ?>
    }
}

我可以做得更好吗?

【问题讨论】:

  • 除了以下优化之外,您可能需要考虑将其设为存储过程而不是直接选择以提高性能。
  • 请注意,此代码容易受到 sql 注入攻击。
  • 你好丹尼尔,为什么会这样?数据只是得到一个数组,在放入之前已经过清理。Aldo、$user['data'] 及其子级也在这段代码之前被清理过。

标签: php mysql


【解决方案1】:

使用IN MySQL operator 在一组值中搜索id

$ids = '"' . implode('", "',$crumbs) . '"';
$query1 = "SELECT id FROM tbl_depts WHERE id IN (" . $ids . ")";
$query2 = "SELECT msg, datetime FROM tbl_motd WHERE deptid IN (" . $ids . ")";

因此您无需使用foreach 循环检索所需的所有数据,因此您将只有 2 个查询而不是 78 个。

示例:我有一个名为 table 的表,其中包含 10 条记录,其 ID 为:1、2、3、4、5、6、7、8、9、10(自动递增)。我知道我需要 ID 为 1、5、8 的记录。我的查询是:

$sql = "SELECT * FROM `table` WHERE id in (1,5,8);";

而且我不明白如果不修改 $crubms 数组值,为什么需要在 foreach 循环中使用 &amp; 运算符。

【讨论】:

  • 所以我会用这个替换上面的两个查询,但自己重写代码?
  • 我把&运算符放进去只是习惯。
  • @Shamil,是的。您将不得不重写代码,因为它使用了另一种方法。
  • @Shamil 那是个坏习惯。您可能偶尔会修改程序中的任何数组,并且很难找出隐藏错误的位置。
  • 使用 & 运算符会使程序运行得稍微快一些,因为程序不需要分配内存来存储每个 $value。
【解决方案2】:

我想这是你想要的。

SELECT msg, datetime
FROM tbl_depts td
INNER JOIN tbl_motd tm ON td.id = tm.deptid

【讨论】:

  • 我应该用哪个替换它?
  • 我并没有真正研究查询的逻辑,但我认为您在某处忘记了WHERE。我认为 OPs 查询结果受到一组特定 ID 的限制。应该是INNER JOIN tbl_motd tm ON td.id = tm.deptid WHERE td.id in (&lt;set of ids&gt;),大概?
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多