数据库结构:
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');
...或者我应该构建一个关联数组,只要我需要使用结果集就一遍又一遍地遍历数组?
感谢您的想法。
答案 0 :(得分:9)
这取决于什么更重要:可读性或性能。我希望单个查询和预填充PHP数组的执行速度会更快,因为数据库连接很昂贵,但是每个部分的简单查询都更具可读性。
除非你知道(而不仅仅是希望)你将获得大量的流量,我会去单独的查询,然后担心优化,如果它看起来像是一个问题。此时,您还需要做其他事情,例如构建数据访问层并添加一些缓存。
答案 1 :(得分:2)
如果“部分”是指用户可以查看的单独的单个页面(单独的HTTP请求),我建议根据需要使用每个类型的查询。如果在只有图像数据集的页面上,您实际上不需要获取视频数据集。你不会真正节省很多时间来获取所有内容,因为无论如何你都会连接到数据库中的每个页面(我假设。)
如果“部分”表示一个页面的不同部分,则立即获取所有内容。这将节省您查询的时间(只有一个查询。)
但是,根据数据集的大小,你可能会遇到PHP内存限制查询所有内容的麻烦。然后,您可以尝试提高内存限制,但如果失败,您可能不得不回退到每个类型的查询。
使用每个类型的查询方法将一些计算负载移动到数据库服务器,因为您只需要请求并获取您真正需要的内容。而且您不必编写代码来过滤和排序结果。过滤和排序是数据库通常比PHP代码更好的东西。如果可能的话,启用MySQL的查询缓存,这将比你用PHP编写的任何东西加速这些查询。
答案 2 :(得分:1)
如果您的数据全部来自一个表格,我只会进行一次查询。
我认为你正在构建一个单独的页面,其中包含一个图片部分,一个视频部分,一个音乐部分等。编写您的查询返回结果按媒体类型排序 - 遍历所有图片,然后是所有视频,那么所有的音乐。
答案 3 :(得分:0)
最好有多个查询。每次运行查询时,所有数据都会被拉出并加载到内存中。如果您有5种不同的类型,则意味着该类型的每个页面加载的数据量是其需要的5倍。
即使一次只有一个,如果你有超过100个,或者你可以合理地一次显示在一个页面上,你很可能会很快开始使用LIMIT / OFFSET查询进行分页。
答案 4 :(得分: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
foreach
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万