2011-03-27 179 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