【发布时间】:2018-10-14 03:40:35
【问题描述】:
每张表数据有1万多条记录。列出此数据时,什么查询结果更快。嵌套查询比连接查询快吗?
嵌套查询:
$query = $baglanti->prepare("Select * from table_1");
$query->execute();
if($query->rowCount() > 0){
while($query_data=$query->fetch(PDO::FETCH_ASSOC)){
$query_2 = $baglanti->prepare("Select * from table_2 where table_1_id = :id");
$query_2->bindParam(":id", $query_data["id"], PDO::PARAM_INT);
$query_2->execute();
if($query_2->rowCount() > 0){
while($query_2_data=$query_2->fetch(PDO::FETCH_ASSOC)){
$query_3 = $baglanti->prepare("Select * from table_3 where table_2_id = :id");
$query_3->bindParam(":id", $query_2_data["id"], PDO::PARAM_INT);
$query_3->execute();
if($query_3->rowCount() > 0){
while($query_3_data=$query_3->fetch(PDO::FETCH_ASSOC)){
table_4
table_5
...
}
}
}
}
}
}
内连接查询:
$query = $baglanti->prepare("Select * from table_1
INNER join table_2
on table_1.id=table_2.table_1_id
INNER join table_3
on table_2.id=table_3.table_2_id
INNER join table_4
on table_3.id=table_4.table_3_id
INNER join table_5
on table_4.id=table_5.table_4_id
...
");
$query->execute();
if($query->rowCount() > 0){
while($query_data=$query->fetch(PDO::FETCH_ASSOC)){
}
}
哪个结果更快? (我已经索引了所有的表)
【问题讨论】:
-
内连接应该工作得更快。嵌套查询几乎总是运行较慢
-
我无法想象嵌套查询会运行得更快的场景。每个人都必须打开一个会话,发送 sql,解析 sql,优化/确定执行路径,运行执行路径,通过管道将数据推送回应用程序。使用 JOIN 是一次访问数据库,然后数据库一次获取所有数据并加入它(它专门编程为有效地执行 CRAZY),然后返回一个结果集。
-
JOIN可以让数据库优化器更好地构建检索数据的方式,并过滤不需要的数据。 -
@JNevill 如果“父数据”包含大量数据,这些数据将乘以大量的小“子数据”,嵌套可能会更好......但即便如此,也有更好的非嵌套选项。
标签: mysql sql join nested-queries