Mysql above 5mil lines

0

Well, I'm developing a code that only came up with the following problem, when I performed a performance test with 5mil lines, it exceeded the limit of 30 seconds ... what could be wrong?

$app->get('/receitagrafico/', function() use ($app) {
$request = \Slim\Slim::getInstance()->request();
 $router = $app->router();

$datai = date("Y-m-01");
$dataf = date("Y-m-t");

    $stmt1 = getConn()->query("SELECT SUM(totalz + entrega - ajuste) AS valor_total_soma FROM movimento WHERE status!='C' AND data BETWEEN '{$datai}' AND '{$dataf}'");
        $onoff = ( $stmt1->rowCount() > 0 ? true : false );
        $dados_produto = $stmt1->fetchObject();
        $total_atual = ( $onoff ? $dados_produto->valor_total_soma : 0 );

    $stmt1 = getConn()->query("SELECT SUM(totalz + entrega - ajuste) AS valor_total_soma FROM movimento WHERE status!='C' AND data BETWEEN '{$datai}' AND '{$dataf}'");
        $onoff = ( $stmt1->rowCount() > 0 ? true : false );
        $dados_produto = $stmt1->fetchObject();
        $bugfix = ( $dados_produto->valor_total_soma == 0 ? 1 : $dados_produto->valor_total_soma );
        $total_passado = ( $onoff ? ($total_atual-$dados_produto->valor_total_soma)/$bugfix*100 : 0 );

$total_lanche = [];
$lanche_lengd = [];
    $stmt1 = getConn()->query("SELECT produtos,data FROM movimento WHERE status!='C' AND data BETWEEN '{$datai}' AND '{$dataf}'");
        $onoff = ( $stmt1->rowCount() > 0 ? true : false );
        while($dados_produto = $stmt1->fetchObject()){
            if ($stmt1->rowCount() > 0) {
                $arr = explode(',', $dados_produto->produtos);
                $arrN_am = array();
                foreach($arr as $item){
                    $valor = explode(':', $item);
                    $arrN_am[][$valor[0]] = $valor[1];
                }
                foreach($arrN_am as $item => $id){
                    foreach($id as $item2 => $id2){
                        $id_produto = $item2;
                        $qtd = $id2;
                        if(is_double($id2)){
                            $qtd = 1;
                        }
                        $stmt3 = getConn()->query("SELECT * FROM produto WHERE hash={$item2}");
                        $resultado_lanche = $stmt3->fetchObject();
                        if (!isset($total_lanche[$resultado_lanche->nome])) {
                            $total_lanche[$resultado_lanche->nome] = $qtd;
                            $lanche_lengd[] = $resultado_lanche->nome;
                        }else{
                            $total_lanche[$resultado_lanche->nome] += $qtd;
                        }
                    }
                }
            }
        }

        if ($onoff){
            $tt3 = $lanche_lengd;
            $tt4 = [];
            foreach($total_lanche as $item => $id){
                $tt4['name'] = 'Abril';
                $tt4['data'][] = $id;
            }
        }else{
            $tt3 = 0;
            $tt4 = false;
        }

echo "[";
echoResponse(200, $total_atual);
echo ",";
echoResponse(200, $total_passado);
echo ",";
echoResponse(200, $tt3);
echo ",";
echoResponse(200, [$tt4]);
echo "]";

});

Return:

[53,0,["Torrada","Cachorro quente"],[{"name":"Abril","data":[4,1]}]]

1st issue: I've done the changes in the variables, in db for DATE, and in the code, I did not put the date as index. I've already done a test with 5 thousand lines in this new code and it continues to exceed the time

bd structure:

newcomparison...ran5milquerys

$stmt3=getConn()->query("SELECT hash,nome FROM produto");
        $resultado_lanche = $stmt3->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
        $resultado_lanche = array_map('reset', $resultado_lanche);
        $resultado_lanche = array_map('reset', $resultado_lanche);

$total_lanche = [];
$lanche_lengd = [];
    $stmt1 = getConn()->query("SELECT produtos,data FROM movimento WHERE status!='C' AND data BETWEEN '{$datai}' AND '{$dataf}'");
        $onoff = ( $stmt1->rowCount() > 0 ? true : false );
        while($dados_produto = $stmt1->fetchObject()){
            if ($stmt1->rowCount() > 0) {
                $arr = explode(',', $dados_produto->produtos);
                $arrN_am = array();
                foreach($arr as $item){
                    $valor = explode(':', $item);
                    $arrN_am[][$valor[0]] = $valor[1];
                }
                foreach($arrN_am as $item => $id){
                    foreach($id as $item2 => $id2){
                        $id_produto = $item2;
                        $qtd = $id2;
                        if(is_double($id2)){
                            $qtd = 1;
                        }

                        if (!isset($total_lanche[$resultado_lanche[$item2]])) {
                            $total_lanche[$resultado_lanche[$item2]] = $qtd;
                            $lanche_lengd[] = $resultado_lanche[$item2];
                        }else{
                            $total_lanche[$resultado_lanche[$item2]] += $qtd;
                        }
                    }
                }
            }
        }
    
asked by anonymous 14.06.2018 / 23:49

1 answer

0

As you are doing a query that uses BETWEEN on a table with many records, the field you use in between must be set to INDEX .

MySQL (and other database engines) will optimize searches that filter through these fields.

    
15.06.2018 / 00:29