【问题标题】:Reuse MySQL result in subsequent queries that have form SELECT DISTINCT from($result) WHERE, ?possible在后续查询中重用 MySQL 结果,这些查询具有 SELECT DISTINCT from($result) WHERE, ?possible
【发布时间】:2016-08-02 14:01:51
【问题描述】:

我有一个非常复杂的查询,它基本上为我提供了一个主表,其中包含来自我的数据库中多个表的不同列的不同组合,称之为 $query(使用 PHP),$result = mysql_query 的结果。我希望能够在后续较小的查询中重用该 $result,而不必再次执行真正复杂的查询。

类似于从 $result WHERE xxx AND xxx AND xxx 中选择 DISTINCT 列。如果我实际上为 $result 输入字符串,它会起作用,但如果它不必超时执行整个复杂的查询,它似乎会更有效。这可能吗?

【问题讨论】:

  • 这应该只是不更改您存储它的变量的问题。如果您尝试先编写代码,然后在出现任何问题时发布代码和任何错误,我们可以提供更具建设性的反馈。
  • 如果你真的在使用mysql_query(),你应该考虑迁移到mysqli_函数或PDOmysql_ 函数很久以前就被弃用了,并在 PHP 7 中被删除。

标签: php mysql


【解决方案1】:

您可以:

  1. 将结果保存到临时表中:

    CREATE TEMPORARY TABLE myTempTable SELECT ...
    

    然后使用它:

    SELECT DISTINCT column FROM myTempTable WHERE xxx AND xxx AND xxx
    

  1. 使用view

    CREATE VIEW myView SELECT ...
    

    然后使用它:

    SELECT DISTINCT column FROM myView WHERE xxx AND xxx AND xxx
    

不同之处在于视图在所有会话中都是可见的,并且会一直持续到手动删除;而临时表仅在创建它们的会话中可见(因此在该会话结束时不再存在)。

另外,视图正是:底层数据的一个视图——因此当底层表被更新时,这些变化将在查询视图时立即反映出来(除了正常的事务隔离行为) .相比之下,临时表(就像普通表一样)保存数据的静态副本,只有在后续查询对其进行显式更新时才会更改。

因此显然存在性能差异:视图可以使用基础表的索引,而临时表必须有自己的定义。但临时表使用缓存数据,因此不必每次都重新运行底层查询(而视图则需要)。

【讨论】:

  • 谢谢。我实际上正在使用 mysqli_query,谢谢,错字。这正是我需要知道的。我可以想象,如果查询很复杂,视图和临时表之间会有很大的性能影响,但好处是视图是动态更新和持久的。很高兴知道。就我而言,我基本上需要在会话期间将结果用于其他查询,这可能是一个很大的数字,然后我可以将其销毁或将其与会话一起销毁。
  • @sscotti:使用临时表,您可以定义会减慢其初始创建/填充速度的索引,但会加快后续检索;你不能用视图来做到这一点。因此,哪种方法对您来说性能最高在很大程度上取决于您的确切架构、数据和查询——可能最好对这两种方法进行基准测试,看看您更喜欢哪一种。
  • 关于使用视图的问题。那些是你在 MySQL 引擎中创建的并且它们持续存在的东西,就像创建一个表一样。所以你不会在 PHP 中以编程方式创建它吗?如果它对其他表的更改具有某种“侦听器”,然后自动更新,那就太神奇了。如果在会话期间其他表没有非常频繁地更新,那么这也很好,在这种情况下,视图将几乎是静态的?
  • 是否有工具可以在开发过程中执行查询基准测试,以便您可以实际衡量哪种方式在各种条件下表现更好?我最近一直在使用“Atom”,它与 PHP 调试器工具和 XDebug 结合使用非常好,但我还没有看到用于基准测试的 MySQL 工具。谢谢。
  • @sscotti:是的,视图是在 MySQL 中创建和持久化的(尽管您可以通过在普通查询接口上发出 DDL 命令来创建 MySQL 数据库对象——即,如果您愿意,可以从 PHP 中完成,但是这不是您每次用户访问网页时都需要做的事情,因为一旦定义它就永远存在)。但是它们不会“监听”更改:每次您从中选择时,MySQL 都会执行底层查询,但它以一种巧妙的方式执行(将任何进一步的逻辑与原始查询结合起来)——这是与临时表的最大区别,它只是存储缓存的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多