高效的MySQL查询:通过多个表运行各种查询,将结果表分配给数组

时间:2011-08-20 14:10:01

标签: php mysql performance

是否有一种运行单个MySQL查询的方法,该查询从各种表中选择数据,并在PHP中单独返回可分配给数组的每个表,而不是每个表的查询并手动将结果分配给阵列

例如

// Interpretation: 
$multiple       = mysql_query("select * from table_a; select * from table_b;");
foreach ($multiple as $table => $results) {
    $tables[$table] = $results;
}

而不是:

$tables         = array (
    "table_a"   => mysql_query ("select * from table_a;"),
    "table_b"   => mysql_query ("select * from table_b;"),
);

任何指导都将非常感谢。谢谢。

3 个答案:

答案 0 :(得分:1)

不是没有讨厌的SQL技巧。我不认为你建议的方式更有效率。如果这两个表是巨大的,那么最好将巨大的请求分解为两个不那么大的请求。

如果它们相对较小,它仍然不会产生太大影响。

但是,如果带宽很高,我仍然不确定在一个查询中是否可以获取两个表。

答案 1 :(得分:0)

你为什么不使用工会?

$multiple = mysql_query("select 'table_a', table_a.* from table_a union select 'table_b', table_b.* from table_b");
$tables=array();
foreach ($multiple as $table => $results)
{
    $tables[$results[0]] = array_shift($results);
}

如果表中的列数不同,则只放入NULL而不是丢失列。除非在测试中,否则我将不会使用*。

不同列数的示例查询:

select 'table_a', table_a.col1, table_a.col2, table_a.col3 from table_a union select 'table_b', table_b.col1, table_b.col2, NULL from table_b;

答案 2 :(得分:0)

打开两个DB链接,使用mysql_unbuffered_query执行查询。 Mysql_unbuffered_query执行查询但是立即返回到PHP代码,而mysql引擎处理查询。以后,当你使用mysql_fetch_row时,就是从mysql引擎中真正检索数据的时候。

这样,如果你在两个数据库链接(两个mysql_connect)中执行两个查询,每个链接的每个查询,你可以开始使用第一个,而mysql引擎是第二个'缓存/工作'你的PHP代码正在执行。

另外,如果使用无缓冲查询,则不能执行mysql_num_rows,因为可能是完整的结果集尚未在内存中。

mysqli-> query(“...”,MYSQLI_ASYNC)或PDO / MYSQL是一种更好,更现代的方法,但你需要一个与ASYNC查询兼容的mysqlnd或libmysql。