有没有更快的方法从多个表中获取信息?

时间:2012-07-04 07:48:50

标签: php mysql sql performance

假设我有七个表,我想对所有表执行相同的查询,然后返回结果。现在我有一些像这样的代码

$dates = array();
foreach ($tables as $table) {
  $result = runStatement("
    SELECT MIN(StartDate) as Start, 
           MAX(EndDate) as End 
           FROM $table WHERE ProjectID = ?",
    array($id));
  $stageDates[$table] = $result[0];
}
echo json_encode($dates);

它可以工作,但它非常慢,因为它必须从七个不同的查询中启动和检索结果。有没有办法将所有查询合并为一个?还有其他方法可以加快速度吗?

3 个答案:

答案 0 :(得分:1)

使用join with subquery将解决问题

SELECT
  MIN(t1.StartDate) as Start,
  MAX(t1.EndDate) as End,
  t2.Start,
  t2.END,
  t3.Start,
  t3.END  
FROM table1 as t1
  left join (SELECT
           MIN(t2.StartDate) as Start,
           MAX(t2.EndDate) as End
         FROM table1) as t2
    on t1.id = t2.id
  left join (SELECT
           MIN(t3.StartDate) as Start,
           MAX(t3.EndDate) as End
         FROM table1) as t3
    on t1.id = t3.id  
    -- and so on --  
WHERE t1.ProjectID = 1

答案 1 :(得分:0)

从不永远将查询放入循环中。这是最糟糕的事情之一。

我不认为你会得到更快的方式,但正如Dagon所说,工会将会更加清洁和安全。

SELECT MIN(StartDate) as Start, MAX(EndDate) as End FROM $table1, $table2, $table3 WHERE ProjectID = ?",

答案 2 :(得分:0)

如果您有七个包含'StartDate','EndDate'和'ProjectID'的表,您可以使用物化视图(http://www.mysqlperformanceblog.com/2011/03/23/using-flexviews-part-one-introduction-to-materialized-views/)或使用Solr或Sphinx索引数据。然后查询要快得多,缺点是数据可能过时。如果几秒钟或几分钟没问题,请查看这些解决方案。