PHP / MySQL:大规模SQL查询还是几个较小的查询?

时间:2013-09-24 11:37:31

标签: php mysql

我在这里有一个数据库设计,以简化版本查看:

building

  • ID
  • ATTRIBUTE1
  • attribute2

那里的数据如下:

  • (1,1,1)
  • (2,1,2)
  • (3,5,4)

表格attribute1_valuesattribute2_values的结构为:

  • ID

其中包含以下信息:

  • (1,“选项1的文字说明”)
  • (2,“选项2的文字说明”)
  • ...
  • (6,“选项6的文字说明”)

我不确定这是否是最好的设置,但它是按照我的项目经理的要求完成的。它肯定有一些道理,因为你现在可以轻松地修改文本而不会弄乱id的。

但是现在我来到了一个需要列出属性的页面,那我该怎么去呢?我看到两个主要选择:

1)制作一个大型查询,从building收集所有值,同时从attribute{x}_values表中选择正确的文本表示。

2)创建一个小查询,从building表中收集所有值。然后在那之后一次获得一个属性的文本表示。

最佳选择是什么?选项1是否更快作为选项2?如果是这样,是否值得维护额外的麻烦?

7 个答案:

答案 0 :(得分:1)

另一个建议是在服务器上创建一个只包含您需要的数据并从中查询的视图。这样可以保持服务器端的工作,并且每次都可以提供所需的内容。

答案 1 :(得分:0)

如果属性表中有少量行,那么我建议先获取它们,然后获取所有行!使用id作为数组中的索引键将它们存储到某个数组中。

然后您可以继续构建数据,现在您只需使用相应的数组来查找属性值

答案 2 :(得分:0)

我会推荐介于两者之间的东西。解析php中第一个表的结果,并确定需要从每个属性[x] _values表中选择多少个属性。

然后,您可以使用每个表一个查询批量选择属性,而不是每个属性一个查询,或每个建筑一个查询。

答案 3 :(得分:0)

这是一个PHP解决方案:

$query = "SELECT * FROM building";
$result = mysqli_query(connection,$query);
$query = "SELECT * FROM attribute1_values";
$result2 = mysqli_query(connection,$query);
$query = "SELECT * FROM attribute2_values";
$result3 = mysqli_query(connection,$query);
$n = mysqli_num_rows($result);
for($i = 1; $n <= $i; $i++) {
    $row = mysqli_fetch_array($result);
    mysqli_data_seek($result2,$row['attribute1']-1);
    $row2 = mysqli_fetch_array($result2);
    $row2['value'] //Use this as the value for attribute one of this object.
    mysqli_data_seek($result3,$row['attribute2']-1);
    $row3 = mysqli_fetch_array($result3);
    $row3['value'] //Use this as the value for attribute one of this object.
}

请记住,此解决方案要求表attribute1_values和attribute2_values从1开始,每行增加1。

答案 4 :(得分:0)

Oracle / Postgres / MySql DBA:

多次运行查询会产生相当多的开销。有多次到db的往返,如果它在远程服务器上,这可以加起来。数据库可能必须在MySql中多次解析同一个查询,如果有大量的行,这将是非常低效的。现在,你的PHP方法(多个查询)有一个优势就是它会使用更少的内存,因为它会释放结果,因为它们不再需要(如果你将查询作为嵌套循环运行,那么,但如果您事先查询所有结果,则会有很多内存开销,具体取决于表的大小。)

最佳结果是将其作为1个查询运行,并一次获取结果1,根据需要显示每个结果并丢弃它,这可能会对MVC框架造成严重破坏,除非您在使用模型代码时感到很舒服您的视图,或运行小视图片段。

答案 5 :(得分:0)

您的问题非常通用,我认为要获得答案,您应该对此页面的外观以及数据集的大小给出更多提示。 你会得到所有属于他们属性的建筑物,或者只是一次? 因为你的数据结构看起来很简单,而且只有raspberrypi可以处理它非常好。

如果您需要一条记录,则不需要任何特殊技术,只需加入表格即可。 如果您需要列出所有建筑物并且想要节省数据库时间,则必须测量数据。 如果您拥有的属性多于建筑物,则必须选择一种方式,如果您有8个属性和2000个建筑物,您可以考虑在数组中使用select选择缓存属性,然后使用数组打印它们。我不认为你会在现代计算机上看到如此简单的表格会有任何速度下降或改进。

$att1[1]='description1'
$att1[2]='description2'
....

答案 6 :(得分:-1)

永远不要一次查询,尝试将它们合并为一个。

MySQL将缓存您的查询,它将运行得更快。 PhP循环比对数据库的许多请求更快。

查询缓存存储SELECT语句的文本以及发送到客户端的相应结果。如果稍后收到相同的语句,则服务器将从查询缓存中检索结果,而不是再次解析和执行语句。

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html