2013-03-26 46 views
2

我使用,我已经执行一个简单的SELECT查询PHP Web服务,并将其存储我可以在另一个MySQL查询的From部分使用以前的MySQL查询的结果吗?

$result = run_query($get_query); 

我现在需要进一步进行查询基于不同的参数,这是我知道的数据通过MySQL是可能的形式如下:

SELECT * 
FROM (SELECT * 
     FROM customers 
     WHERE CompanyName > 'g') 
WHERE ContactName < 'g' 

我知道这会在表上执行两个Select查询。但是,我想知道的是,如果我可以简单地在第二部分的FROM部分中使用先前保存的查询,并且如果我相信它通过不再查询整个数据库来帮助性能是真的,那么它是真的:

SELECT * 
FROM ($result) 
WHERE ContactName < 'g' 
+0

可能的重复:http://stackoverflow.com/questions/1350279/mysql-php-query-a-result-set – codea 2013-03-26 16:18:02

+0

@codea它不是一个重复的..这是一个性能问题不是一个简单的“如何查询结果集“ – Luceos 2013-03-26 16:18:45

+0

我承认这里有区别 – codea 2013-03-26 16:21:24

回答

0

如果我正确理解你的问题,你想知道是否将你的SQL查询的“from”部分保存在一个php变量中可以提高你查询SQL服务器的性能,那么答案是NO。只是因为保留该值的变量插入到查询中。

无论使用PHP获得的性能如何,答案最可能是肯定的;但取决于变量值的长度(以及多久重复使用变量而不是构建新的完整查询)性能是否值得注意。

+0

我没有保存$ result中的Where部分,而是运行第一个Query的结果。第二条语句然后查询第一条语句的结果,我相信这应该通过不要求PHP文件再次访问整个MySQL表格来处理,而是仅处理存储的结果。 – 2013-03-26 16:21:04

+0

然后,从第一个查询存储结果是愚蠢的。将两个查询合并为一个较长的查询会更明智。这在表现上总是更好。 – Luceos 2013-03-26 16:24:37

+0

我需要执行第三个查询的三个不同变体。表本身很快变得非常大,所以我想尽量减少查询次数,这就是为什么我想使用第一个查询的结果。 – 2013-03-26 16:34:39

0

为什么不直接在这样的单个查询中获取这些数据?

SELECT * 
FROM customers 
WHERE CompanyName > 'g' 
AND ContactName < 'g' 
+0

我认为问题的关键在于性能,而不是如何查询数据库以及如何成功地组合查询,尽管建议从根本上改善sql性能是有意义的。 – Luceos 2013-03-26 16:22:17

+0

@Luceos是的,我明白这一点。此查询将提供最佳性能,因为它将允许使用使用subselect的CompanyName和ContactName上的索引来禁止对ContactName查询使用索引。 – 2013-03-26 16:24:35

+0

这只是一个例子,并不完全是正在执行的查询。有第三个查询,所以通过这样做,而不是分别访问MySQL表3次,我只会这样做一次,然后处理存储的结果我需要的次数。 – 2013-03-26 16:24:52

1

你可以做一个临时表把最初的结果,然后用它来选择数据,并在第二个查询。只有当您的第一个查询速度较慢时,这会更快。

+0

在我看来,如果有几个用户同时访问网络服务,那么我就不得不相信这个问题。 – 2013-03-26 18:24:29

+1

临时表仅对创建它们的会话可见。 – Vatev 2013-03-26 19:08:57

+0

谢谢,不知道。将试试看它与我在答案中链接到的功能的比较。 – 2013-03-26 19:28:10

1

PHP和SQL是不同的语言和非常不同的平台。他们甚至不会在同一台计算机上运行。您的PHP变量将不会与MySQL服务器进行任何交互。您使用PHP创建一个恰好包含SQL代码的字符串,但仅此而已。最后,唯一重要的是您发送给服务器的SQL代码 - 您如何设法生成它是无关紧要的。

此外,你真的不能说,MySQL将如何运行一个查询,除非你得到一个解释计划:

EXPLAIN EXTENDED 
SELECT * 
FROM (SELECT * 
     FROM customers 
     WHERE CompanyName > 'g') 
WHERE ContactName < 'g' 

...但我怀疑它会读取表两次查询。内存比磁盘快得多。

相关问题