Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP/MYSQL、for循环中的第n个术语查询或在初始查询后推送ID数组后的in查询中,什么更快?_Php_Mysql_Performance - Fatal编程技术网

在PHP/MYSQL、for循环中的第n个术语查询或在初始查询后推送ID数组后的in查询中,什么更快?

在PHP/MYSQL、for循环中的第n个术语查询或在初始查询后推送ID数组后的in查询中,什么更快?,php,mysql,performance,Php,Mysql,Performance,我想知道这种逻辑是否会提高查询性能,比如说,检查用户是否喜欢数组中每个元素上的帖子,然后为每个元素触发查询 相反,我可以将主id推送到一个数组中,然后对它们执行IN查询,这将减少15个第n项查询,并将其批处理为2个查询,包括初始查询 我使用的是PHP PDO,MYSQL 有什么建议吗?我在正确的轨道上吗D $items是来自数据库的结果集,在本例中,它们是用户询问的问题,我在大约140毫秒内得到响应,并且我设置了分页一次加载多少个项目的限制 $questionIds = [];

我想知道这种逻辑是否会提高查询性能,比如说,检查用户是否喜欢数组中每个元素上的帖子,然后为每个元素触发查询

相反,我可以将主id推送到一个数组中,然后对它们执行IN查询,这将减少15个第n项查询,并将其批处理为2个查询,包括初始查询

我使用的是PHP PDO,MYSQL

有什么建议吗?我在正确的轨道上吗D

$items是来自数据库的结果集,在本例中,它们是用户询问的问题,我在大约140毫秒内得到响应,并且我设置了分页一次加载多少个项目的限制

    $questionIds = [];

    foreach ($items as $item) {
        array_push($questionIds, $item->question_id);
    }

    $items = loggedInUserLikesQuestions($questionIds, $items, $user_id);

IN子句在执行SQL查询时肯定更快。然而,只有当in子句中的项目数(平均)增加时,您才会看到显著的实际时钟速度优势

存在速度差异的原因是每个查询的设置、执行、分解和响应,以及发送/接收到服务器,即使单个更新可能非常快。当你以最快的速度完成数千(或数百万)个这样的任务时,我看到的是,不是500/秒,而是200000/秒。这可能会给你一些想法

但是,使用IN子句方法时,需要确保IN子句不会变得太大,并达到最大查询大小(请参阅)

下面是一组简单的函数,这些函数将自动批处理成包含1000项的IN子句:

<?php

$db = new PDO('...');
$__q = [];
$flushQueue = function() use ($db, &$__q) {
    if ( count($__q) > 0 ) {
        $sanitized_ids = [];
        foreach ( $__q as $id ) { $sanitized_ids[] = (int) $id; }
        $db->query("UPDATE question SET linked = 1 WHERE id IN (". join(',',$sanitized_ids) .")");
        $__q = [];
    }
};
$queuedUpdate = function($question_id) use (&$__q, $flushQueue){
    $__q[] = $question_id;
    if ( count( $__q) > 1000 ) { $flushQueue(); }
};


// Then your code...
foreach ($items as $item) {
    $queuedUpdate($item->question_id);
}
$flushQueue();

肯定IN子句在执行SQL查询时更快。然而,只有当in子句中的项目数(平均)增加时,您才会看到显著的实际时钟速度优势

存在速度差异的原因是每个查询的设置、执行、分解和响应,以及发送/接收到服务器,即使单个更新可能非常快。当你以最快的速度完成数千(或数百万)个这样的任务时,我看到的是,不是500/秒,而是200000/秒。这可能会给你一些想法

但是,使用IN子句方法时,需要确保IN子句不会变得太大,并达到最大查询大小(请参阅)

下面是一组简单的函数,这些函数将自动批处理成包含1000项的IN子句:

<?php

$db = new PDO('...');
$__q = [];
$flushQueue = function() use ($db, &$__q) {
    if ( count($__q) > 0 ) {
        $sanitized_ids = [];
        foreach ( $__q as $id ) { $sanitized_ids[] = (int) $id; }
        $db->query("UPDATE question SET linked = 1 WHERE id IN (". join(',',$sanitized_ids) .")");
        $__q = [];
    }
};
$queuedUpdate = function($question_id) use (&$__q, $flushQueue){
    $__q[] = $question_id;
    if ( count( $__q) > 1000 ) { $flushQueue(); }
};


// Then your code...
foreach ($items as $item) {
    $queuedUpdate($item->question_id);
}
$flushQueue();

A
查询
尤其是在
查询中执行一个简单的
,几乎总是会减少开销。帮你自己一个忙,创建一个包含100个元素的静态数组,然后做
循环
vs
查询
实验。。。您自己对其进行基准测试,答案将很简单。
中的
最适合需要修改数据的情况(根据用户的喜好设置问题)。但是,如果您的目标只是创建一个用户以前喜欢的问题列表,那么最有效的选择很可能是一个查询,并根据需要进行连接。也就是说:
从问题q中选择q.id,q.name左加入用户_喜欢ul ON q.id=ul.quest_id和ul.user_id=123
谢谢Tony,我们已经完成了这项工作,它已经投入生产一段时间了,我只是在优化性能,目前为止还不错!我已经重写了SQL查询,现在我正在使用所有需要在上面计算的内容-我使用PHP将计算值映射到用户喜欢或报告问题的每个对象属性上,在所有这些计算喜欢的内容之前,存储过程,和用户报告。一个
查询
尤其是一个简单的
IN
查询几乎总是开销较小。帮你自己一个忙,创建一个包含100个元素的静态数组,然后做
循环
vs
查询
实验。。。您自己对其进行基准测试,答案将很简单。
中的
最适合需要修改数据的情况(根据用户的喜好设置问题)。但是,如果您的目标只是创建一个用户以前喜欢的问题列表,那么最有效的选择很可能是一个查询,并根据需要进行连接。也就是说:
从问题q中选择q.id,q.name左加入用户_喜欢ul ON q.id=ul.quest_id和ul.user_id=123
谢谢Tony,我们已经完成了这项工作,它已经投入生产一段时间了,我只是在优化性能,目前为止还不错!我已经重写了SQL查询,现在我正在使用所有需要在上面计算的内容-我使用PHP将计算出的值映射到用户喜欢或报告问题的每个对象属性、所有这些计算喜欢的内容之前的存储过程以及用户报告。感谢您的回答-非常有用!是的,我将我的尺寸保持在25,它同时运行两个额外的IN查询,然后将计算出的值映射回匹配它的正确条件的对象数组,我在本地看到性能改进-在live server上,速度也很快,但我想服务器已经在医生那里进行了一点健康检查!谢谢你的回答-非常有帮助!是的,我将我的尺寸保持在25,它同时运行两个额外的IN查询,然后将计算出的值映射回匹配它的正确条件的对象数组,我在本地看到性能改进-在live server上,速度也很快,但我想服务器已经在医生那里进行了一点健康检查!