2011-03-27 176 views
1

考慮「查詢1」,這是非常耗時的。 「Query1」不是靜態的,它取決於$ language_id參數,這就是爲什麼我不能將它保存在服務器上。 我想用另一個查詢語句來查詢這個「Query1」。我期望,這應該是快速的。我看也許是2種方式如何重新查詢一個查詢?

  1. $結果= mysql_query( 'SELECT * FROM raw_data_tbl WHERE((ID = $ LANGUAGE_ID)AND(年齡> 13))');

    那麼是什麼?在這裏,我想採取的結果和重新查詢它類似於:

    $ result2 = mysql_query('SELECT * FROM $ result WHERE(Salary> 1000)');

  2. 是否有可能在服務器端直接創建類似於「基於變量的」MYSQL查詢並將某種變量$ language_id傳遞給它?第二個查詢會查詢該查詢:-)

謝謝...

+0

你可以使用嵌套SQL查詢,如果你想。 – JohnP 2011-03-27 11:19:05

回答

3

沒有,有沒有這樣的事情作爲你的第二個觀點。


對於第一個想法,不過,我會去與一個單一的查詢:

select * 
from raw_data 
where id = $language_id 
    and age > 13 
    and Salary > 1000 

只要你有設置正確的索引你的桌子上,這個查詢應該是相當快的。


這裏,考慮到查詢的WHERE子句中,我至少會與這三列的索引去:

  • id
  • age
  • Salary

這應該會加速一些事情。


有關索引的更多信息,以及查詢的優化,來看看:

+0

非常感謝給我正確的方向......我認爲有像查詢「預備」的東西......上面的確是一個簡單的例子,我不打擾分裂成2個步驟的查詢... – lyborko 2011-03-29 15:55:08

0

儘管最好的解決辦法是隻需將第二個查詢中的條件添加到第一個查詢中,就可以使用temporary tables來存儲臨時結果。但如果你把它放在一個查詢中,它會更好。您可以使用subqueries,如SELECT * FROM (SELECT * FROM table WHERE ...) WHERE ...

2

隨着子查詢的使用,你可以利用MySQL的緩存設施。

SELECT * FROM raw_data_tbl WHERE (ID='eng') AND (age>13); 

...並在此之後:

SELECT * FROM (SELECT * FROM raw_data_tbl WHERE (ID='eng') AND (age>13)) WHERE salary > 1000; 

不過,這只是在一些非常罕見的情況下是有益的。

隨着權利不動產,您的查詢將運行得足夠快,而不需要欺騙。在你的情況下:

CREATE INDEX filter1 ON raw_data_tbl (ID, age, salary); 
+0

謝謝.. ..見我上面的評論.... – lyborko 2011-03-29 15:56:53