6

数据库结构:

id  galleryId                 type     file_name       description
1   `artists_2010-01-15_7c1ec`  `image`  `band602.jpg`   `Red Umbrella Promo`
2   `artists_2010-01-15_7c1ec`  `image`  `nov7.jpg`      `CD Release Party`
3   `artists_2010-01-15_7c1ec`  `video`  `band.flv`      `Presskit`

我将为应用程序的一个部分提取图像,在另一个部分提取视频等。为每个部分进行多个 mysql 查询是否更好,如下所示:

$query = mysql_query("SELECT * FROM galleries WHERE galleryId='$galleryId' && type='image');

...或者我应该构建一个关联数组,并在需要使用结果集时一遍又一遍地遍历数组?

谢谢你的想法。

4

5 回答 5

12

这取决于更重要的是:可读性或性能。我希望单个查询和预填充 PHP 数组的执行速度会更快,因为数据库连接很昂贵,但是每个部分的简单查询更具可读性。

除非您知道(而不仅仅是希望)您将获得大量流量,否则我会进行单独的查询,然后担心优化是否会出现问题。到那时,无论如何您都会想做其他事情,例如构建数据访问层和添加一些缓存。

于 2010-01-15T18:27:18.417 回答
2

如果“部分”是指用户可以查看的单独的单个页面(单独的 HTTP 请求),我会根据需要建议按类型查询。如果在只有图像数据集的页面上,您实际上不需要获取例如视频数据集。您不会真正节省太多时间来获取所有内容,因为无论如何您都会为每个页面点击连接到数据库(我假设。)

如果“部分”是指一页的不同部分,则一次获取所有内容。这将节省您查询的时间(只有一个查询。)

但是,根据数据集的大小,您可能会遇到 PHP 的内存限制查询所有内容的问题。然后,您可以尝试提高内存限制,但如果失败,您可能不得不退回到每个类型的查询。

使用按类型查询的方法将一些计算负载转移到数据库服务器,因为您只会请求和获取您真正需要的内容。而且您不必编写代码来过滤和排序您的结果。过滤和排序是数据库通常比 PHP 代码更擅长的事情。如果可能的话,启用 MySQL 的查询缓存,这将比你用 PHP 编写的任何东西更快地加速这些查询。

于 2010-01-15T18:15:21.597 回答
2

如果你的数据都来自一张表,我只会做一个查询。

我假设您正在构建一个页面,其中包含图片部分、视频部分、音乐部分等。编写按媒体类型排序的查询返回结果 - 遍历所有图片,然后是所有视频,然后是所有音乐。

于 2010-01-15T19:17:50.193 回答
1

最好有多个查询。每次运行查询时,所有数据都会被拉出并加载到内存中。如果您有 5 种不同的类型,则意味着该类型的每个页面加载的数据量是它需要加载的 5 倍。

即使一次只有一个,如果您有超过 100 个或者可以合理地一次在一个页面上显示的数量,您可能会想要相当快地开始使用 LIMIT/OFFSET 查询进行分页。

于 2010-01-15T18:02:41.363 回答
0

这真的取决于,

IN 运算符

ini_set('memory_limit', '-1');
$startMemory = memory_get_usage();
$conn = mysqli_connect("localhost", "", "", "");
$ar = array();
$sql = "SELECT * FROM table WHERE e IN (.....)";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    $ar[$row['c']] = $row;
}

echo (memory_get_usage() - $startMemory) / 1024 / 1024, ' MB'; //1409.7124481201
$end_time = microtime(true);
echo ($end_time - $start_time) . ' Seconds'; //5.2406549453735 Seconds

前锋

ini_set('memory_limit', '-1');
$startMemory = memory_get_usage();
$conn = mysqli_connect("localhost", "", "", "");
$ar = array();
$array_loop = array(....)
foreach($array_loop as $key => $value){
   $sql = "SELECT * FROM table WHERE e = '$value'";
   $result = mysqli_query($conn, $sql);
   while ($row = mysqli_fetch_assoc($result)) {
      $ar[$row['c']] = $row;
   }
}

echo (memory_get_usage() - $startMemory) / 1024 / 1024, ' MB'; //42.773330688477 MB 
$end_time = microtime(true);
echo ($end_time - $start_time) . ' Seconds'; //12.469061136246 Seconds

我注意到 foreach 消耗时间但不消耗内存,IN 运算符消耗内存但不消耗时间。所有测试都是基于 sql procudre 生成的测试数据完成的,大约 100 万

于 2021-07-18T09:10:22.637 回答