2013-03-26 47 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' 

...但我懷疑它會讀取表兩次查詢。內存比磁盤快得多。

相關問題