2013-09-24 41 views
7

我有一个数据库设计在这里,看起来这简化版本:PHP/MySQL:海量SQL查询或几个较小的查询?

building

  • ID
  • ATTRIBUTE1
  • attribute2

数据中有这样的:

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

以及表,attribute1_valuesattribute2_values,构成为:

  • ID

其中包含了类似的信息:

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

我不确定这是否是最好的设置,但它是按照我的项目经理的要求完成的。它肯定有一些事实,因为你可以很容易地修改文本,而不会搞乱编号。

但是现在我已经到了一个页面,我需要列出这些属性,那么我该怎么去呢?我看到两个主要选项:

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

2)创建一个小型查询,收集表building中的所有值。然后,每次获取每个属性的文本表示。

什么是最好的选择?选项1的选择更快吗?如果是这样,是否值得维护方面的额外麻烦?

+6

一个单一的数据库查询通常要远小于多个查询效率更高,应该是更少的代码以及 –

+0

@MarkBaker可以有多达20个虽然属性...任何理由有不同的意见呢? – skiwi

+0

属性越多,使用单个查询而不是20个单独查询的理由越多 - 执行查询的时间成本要比循环遍历结果集的时间成本高很多,因此每个返回1个结果的20个查询几乎不可避免地比1个查询返回20个结果慢很多 –

回答

-1

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

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

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

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

0

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

然后你就可以用建筑数据继续,现在你只需要使用相应的阵列来寻找属性值

0

我会建议在东西之间。解析php中第一个表的结果,并计算出需要从每个属性[x] _values表中选择多少个属性。

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

1

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

+0

从效率的角度来看,如何让一个视图与一个查询完全不同? –

+0

将数据收集到一个视图中,然后进行查询,以便在每次需要提取数据时都不会发现自己写满了连接的长查询。它比任何代码更有效率。由于它位于多个表格中,因此它还使得他可以更方便地查看数据库中的数据。我无法真正想象为什么你不想要一个观点,除非你有一个考虑因素,我不考虑。 – dsimer

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个开始并增加。

0

甲骨文/的Postgres/MySQL数据库管理员在这里:

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

最佳结果是将其作为1个查询运行,并一次获取结果1,根据需要显示每个结果并丢弃它,这可能会严重破坏MVC框架,除非您要么舒服地运行模型代码在你看来,或运行小视图片段。

0

你的问题是非常通用的,我认为要得到一个答案,你应该给出更多的提示,说明这个页面的外观和数据集有多大。 你会得到所有与他们的属性或只有一个时间? 因为你的数据结构看起来很简单,而且比raspberrypi更能处理它。

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

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