我有一个非常复杂的查询,它基本上为我提供了一个主表,其中包含来自我数据库中多个表的各种列的不同组合,称为$ query(使用PHP),$ result = mysql_query的结果。我希望能够在后续较小的查询中重用该$ result,而无需再次执行真正复杂的查询。
来自$ result WHERE xxx AND xxx AND xxx的SELECT DISTINCT列。它可以找到我是否真的为$ result输入字符串,但如果它不必超时执行整个复杂查询,它似乎更有效。这可能吗?
答案 0 :(得分:2)
你可以:
将结果保存到临时表中:
CREATE TEMPORARY TABLE myTempTable SELECT ...
然后使用:
SELECT DISTINCT column FROM myTempTable WHERE xxx AND xxx AND xxx
或
使用view:
CREATE VIEW myView SELECT ...
然后使用:
SELECT DISTINCT column FROM myView WHERE xxx AND xxx AND xxx
不同之处在于视图在所有会话中都是可见的,并且会持续到手动删除为止;而临时表只在创建它们的会话中可见(因此当该会话结束时不再存在)。
此外,视图正是:基础数据的视图 - 因此当更新基础表时,查询视图时会立即反映此类更改(正常的事务隔离行为除外) 。相比之下,临时表(就像普通表一样)保存数据的静态副本,只有在后续查询显式更新时才会更改。
显然,性能存在差异:视图可以使用基础表的索引,而临时表必须有自己的定义。但临时表使用缓存数据,因此不必每次都重新运行基础查询(而视图会这样做)。