【问题标题】:SQL statement takes 26 seconds in laravel to execute, at phpmyadmin takes .0075 secondsSQL 语句在 laravel 中执行需要 26 秒,在 phpmyadmin 中需要 0.0075 秒
【发布时间】:2020-05-23 23:27:51
【问题描述】:

我有一个涉及 6 个表的 sql 语句,在 laravel 中执行它需要 26 秒,但在 phpmyadmin 中执行相同的 sql 语句大约需要 0.0075 到 0.0089 秒。

这是我在 laravel 中的代码:

use DB;    
$partidas = DB::select("SELECT A.Patente, A.Pedimento, A.SeccionAduanera, A.Fraccion, A.SecuenciaFraccion, A.ValorComercial, A.PrecioUnitario, A.CantidadUMComercial, A.UnidadMedidaComercial, A.CantidadUMTarifa, A.UnidadMedidaTarifa, A.MetodoValorizacion, A.PaisOrigenDestino, A.PaisCompradorVendedor,  
                                                B.ClavePermiso, B.NumeroPermiso, 
                                                C.ClaveCaso, C.IdentificadorCaso, C.ComplementoCaso, 
                                                D.ClaveContribucion, D.FormaPago, D.ImportePago, 
                                                E.TasaContribucion, E.TipoTasa, 
                                                F.Observaciones
                                        FROM `551` A
                                        INNER JOIN `553` B ON B.Fraccion = A.Fraccion
                                                AND (A.SecuenciaFraccion = B.SecuenciaFraccion)
                                                AND (A.auditoria_id = 4 AND B.auditoria_id = 4)
                                                AND (A.Patente = '3452' AND B.Patente = '3452')
                                                AND (A.Pedimento = '0000180' AND B.Pedimento = '0000180') 
                                                AND (A.SeccionAduanera = '430' AND B.SeccionAduanera = '430')
                                        INNER JOIN `554` C ON C.Fraccion = A.Fraccion 
                                                AND (A.SecuenciaFraccion = C.SecuenciaFraccion)
                                                AND (A.auditoria_id = 4 AND C.auditoria_id = 4)
                                                AND (A.Patente = '3452' AND C.Patente = '3452')
                                                AND (A.Pedimento = '0000180' AND C.Pedimento = '0000180') 
                                                AND (A.SeccionAduanera = '430' AND C.SeccionAduanera = '430')
                                        INNER JOIN `557` D ON D.Fraccion = A.Fraccion 
                                                AND (A.SecuenciaFraccion = D.SecuenciaFraccion)
                                                AND (A.auditoria_id = 4 AND D.auditoria_id = 4)
                                                AND (A.Patente = '3452' AND D.Patente = '3452')
                                                AND (A.Pedimento = '0000180' AND D.Pedimento = '0000180') 
                                                AND (A.SeccionAduanera = '430' AND D.SeccionAduanera = '430')
                                        INNER JOIN `556` E ON E.Fraccion = A.Fraccion 
                                                AND (A.SecuenciaFraccion = E.SecuenciaFraccion)
                                                AND (A.auditoria_id = 4 AND E.auditoria_id = 4)
                                                AND (A.Patente = '3452' AND E.Patente = '3452')
                                                AND (A.Pedimento = '0000180' AND E.Pedimento = '0000180') 
                                                AND (A.SeccionAduanera = '430' AND E.SeccionAduanera = '430')
                                        INNER JOIN `558` F ON F.Fraccion = A.Fraccion 
                                                AND (A.SecuenciaFraccion = F.SecuenciaFraccion)
                                                AND (A.auditoria_id = 4 AND F.auditoria_id = 4)
                                                AND (A.Patente = '3452' AND F.Patente = '3452')
                                                AND (A.Pedimento = '0000180' AND F.Pedimento = '0000180') 
                                                AND (A.SeccionAduanera = '430' AND F.SeccionAduanera = '430')
                                        ");
                dd($partidas);

我需要知道我是否可以用 eloquent 或其他方式发表声明以在 laravel 中获得更好的性能。

谢谢!

PD:英语不是我的母语,如有错误请见谅!

【问题讨论】:

  • 当您构建一个名为 551 的表时,发生了根本性的错误
  • 你能解释一下为什么你有相同的数据库来搜索相同的数据。
  • 海关审核程序。海关发送文件(因此名称为 551、553 等)。并且在每个文件中都有特定的信息,在 551 个产品、553 个保险、554 个卖家等中。为了审计它,客户需要连接不同表中的某些数据。我在语句中输入的字段是连接表的字段。
  • 您的 PHP 代码是远程的还是与数据库位于同一服务器中?我这么说是因为phpMyAdmin可能在同一个服务器,如果查询完全一样,可能是你的连接太慢了。
  • 他们在同一个服务器(本地主机)

标签: php mysql laravel


【解决方案1】:

试试这个,它可能有时间像在你的 phpmyadmin 中一样

<?php

use DB;

$pdo = DB::connection()->getPdo();

$SQL = "SELECT A.Patente, A.Pedimento, A.SeccionAduanera, A.Fraccion, A.SecuenciaFraccion, A.ValorComercial, A.PrecioUnitario, A.CantidadUMComercial, A.UnidadMedidaComercial, A.CantidadUMTarifa, A.UnidadMedidaTarifa, A.MetodoValorizacion, A.PaisOrigenDestino, A.PaisCompradorVendedor,  
        B.ClavePermiso, B.NumeroPermiso, 
        C.ClaveCaso, C.IdentificadorCaso, C.ComplementoCaso, 
        D.ClaveContribucion, D.FormaPago, D.ImportePago, 
        E.TasaContribucion, E.TipoTasa, 
        F.Observaciones
    FROM `551` A
    INNER JOIN `553` B ON B.Fraccion = A.Fraccion
        AND (A.SecuenciaFraccion = B.SecuenciaFraccion)
        AND (A.auditoria_id = 4 AND B.auditoria_id = 4)
        AND (A.Patente = '3452' AND B.Patente = '3452')
        AND (A.Pedimento = '0000180' AND B.Pedimento = '0000180') 
        AND (A.SeccionAduanera = '430' AND B.SeccionAduanera = '430')
    INNER JOIN `554` C ON C.Fraccion = A.Fraccion 
        AND (A.SecuenciaFraccion = C.SecuenciaFraccion)
        AND (A.auditoria_id = 4 AND C.auditoria_id = 4)
        AND (A.Patente = '3452' AND C.Patente = '3452')
        AND (A.Pedimento = '0000180' AND C.Pedimento = '0000180') 
        AND (A.SeccionAduanera = '430' AND C.SeccionAduanera = '430')
    INNER JOIN `557` D ON D.Fraccion = A.Fraccion 
        AND (A.SecuenciaFraccion = D.SecuenciaFraccion)
        AND (A.auditoria_id = 4 AND D.auditoria_id = 4)
        AND (A.Patente = '3452' AND D.Patente = '3452')
        AND (A.Pedimento = '0000180' AND D.Pedimento = '0000180') 
        AND (A.SeccionAduanera = '430' AND D.SeccionAduanera = '430')
    INNER JOIN `556` E ON E.Fraccion = A.Fraccion 
        AND (A.SecuenciaFraccion = E.SecuenciaFraccion)
        AND (A.auditoria_id = 4 AND E.auditoria_id = 4)
        AND (A.Patente = '3452' AND E.Patente = '3452')
        AND (A.Pedimento = '0000180' AND E.Pedimento = '0000180') 
        AND (A.SeccionAduanera = '430' AND E.SeccionAduanera = '430')
    INNER JOIN `558` F ON F.Fraccion = A.Fraccion 
        AND (A.SecuenciaFraccion = F.SecuenciaFraccion)
        AND (A.auditoria_id = 4 AND F.auditoria_id = 4)
        AND (A.Patente = '3452' AND F.Patente = '3452')
        AND (A.Pedimento = '0000180' AND F.Pedimento = '0000180') 
        AND (A.SeccionAduanera = '430' AND F.SeccionAduanera = '430')
";

$stmt = $pdo->prepare($SQL);
$stmt->execute();

var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));

【讨论】:

  • 感谢您的回答!但它仍然需要相同的时间。我改变了最后一行 $stmt->fetchAll($pdo::FETCH_ASSOC);
【解决方案2】:

是的,总是有改进的余地。

  • 首先使用Eloquent Relationship 而不是原始mysql。如果您要使用 Laravel,请阅读文档,没有比这更容易的了。
  • 其次,使用 select() 尽量减少不必要的数据使用/消耗。 优化代码是一项很好的技能。在optimization on laravel 上查看此答案。
  • 正确使用数据类型。

    A.Patente = '3452' 如果您的 Patente 是 int 类型,那么与 string 比较将需要更多处理时间。而是做A.Patente = 3452。比较 int 和 int。

我相信,当您按照这些步骤操作时,您的查询时间不会超过 1 秒。让我在下面的 cmets 中发布。干杯!

【讨论】:

    【解决方案3】:

    感谢 discord 的用户 pablov 或 pablete 帮助我解决了我的问题!

    需要注意的是我做过删除表的测试,例如我从A和B开始,效果很好,ABC等。直到F开始出现缓慢的问题,我想是因为表和记录太多我必须审查,直到 Pablete 给了我这个选项并且它起作用了。

    句子如下:

    $partidas = DB::select("SELECT A.Patente, A.Pedimento, A.SeccionAduanera, A.Fraccion, A.SecuenciaFraccion, A.ValorComercial, A.PrecioUnitario, 
                                            A.CantidadUMComercial, A.UnidadMedidaComercial, A.CantidadUMTarifa, A.UnidadMedidaTarifa, A.MetodoValorizacion, A.PaisOrigenDestino, 
                                            A.PaisCompradorVendedor, 
                                            B.ClavePermiso, B.NumeroPermiso, 
                                            C.ClaveCaso, C.IdentificadorCaso, C.ComplementoCaso, 
                                            D.ClaveContribucion, D.FormaPago, D.ImportePago, 
                                            E.TasaContribucion, E.TipoTasa, 
                                            F.Observaciones 
                                    FROM `551` A 
                                    LEFT JOIN `553` B ON B.Fraccion = A.Fraccion AND (A.SecuenciaFraccion = B.SecuenciaFraccion) AND (A.auditoria_id = B.auditoria_id) AND (A.Patente = B.Patente) AND (A.Pedimento = B.Pedimento) AND (A.SeccionAduanera = B.SeccionAduanera) 
                                    LEFT JOIN `554` C ON C.Fraccion = B.Fraccion AND (B.SecuenciaFraccion = C.SecuenciaFraccion) AND (B.auditoria_id = C.auditoria_id) AND (B.Patente = C.Patente) AND (B.Pedimento = C.Pedimento) AND (B.SeccionAduanera = C.SeccionAduanera) 
                                    LEFT JOIN `557` D ON D.Fraccion = A.Fraccion AND (A.SecuenciaFraccion = D.SecuenciaFraccion) AND (A.auditoria_id = D.auditoria_id) AND (A.Patente = D.Patente) AND (A.Pedimento = D.Pedimento) AND (A.SeccionAduanera = D.SeccionAduanera) 
                                    LEFT JOIN `556` E ON E.Fraccion = A.Fraccion AND (A.SecuenciaFraccion = E.SecuenciaFraccion) AND (A.auditoria_id = E.auditoria_id) AND (A.Patente = E.Patente) AND (A.Pedimento = E.Pedimento) AND (A.SeccionAduanera =  E.SeccionAduanera) 
                                    LEFT JOIN `558` F ON F.Fraccion = A.Fraccion AND (A.SecuenciaFraccion = F.SecuenciaFraccion) AND (A.auditoria_id = F.auditoria_id) AND (A.Patente = F.Patente) AND (A.Pedimento = F.Pedimento) AND (A.SeccionAduanera = F.SeccionAduanera)
                                    Where A.auditoria_id = 4
                                    And A.Patente = '3452'
                                    And A.Pedimento = '0000180'
                                    And A.SeccionAduanera = '430'
                                    ");
    

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多