2017-03-18 11 views
0

i verwendet diese Abfrage optimieren:wie mysql query in Phalcon

$brands = TblBrand::find(array("id In (Select p.brand_id From EShop\\Models\\TblProduct as p Where p.id In (Select cp.product_id From EShop\\Models\\TblProductCategory as cp Where cp.group_id_1='$id'))", "order" => "title_fa asc")); 
      if($brands != null and count($brands) > 0) 
      { 
       foreach($brands as $brand) 
       { 
        $brandInProductCategory[$id][] = array 
        (
         "id" => $brand->getId(), 
         "title_fa" => $brand->getTitleFa(), 
         "title_en" => $brand->getTitleEn() 
        ); 
       } 
      } 

TblBrand => 110 Datensätze

TblProduct => 2000 Datensätze

TblProductCategory => 2500 Datensätze

wenn ich diesen Code verwendet, meine Seite nicht anzeigen und Seite sehr lange Zeit laden. .. aber wenn ich diesen Code entferne, zeige meine Seite.

Wie löst man dieses Problem?

+0

Können Sie die gesamte Abfrage-Dump Soweit ich sehen kann, Sie subquery in Unterabfrage haben, die anfällig ist, langsam zu sein? – Mihai

Antwort

1

Das Problem ist Ihre Abfrage. Sie verwenden die IN-Anweisung in einem verschachtelten Format, und das wird immer langsamer als alles andere. MySQL muss zuerst auswerten, was in der IN-Anweisung ist, zurückgeben und dann für die nächste Ebene der Datensätze erneut ausführen.

Versuchen Sie, Ihre Anfrage zu vereinfachen. Etwas wie folgt aus:

SELECT * 
FROM Brands 
INNER JOIN Products ON Brand.id = Products.brand_id 
INNER JOIN ProductCategory ON ProductCategory.product_id = Products.id 
WHERE ProductCategory.group_id_1 = $id 

die oben Um das zu erreichen, können Sie entweder den Query Builder verwenden und die Ergebnisse, die Art und Weise

https://docs.phalconphp.com/en/latest/api/Phalcon_Mvc_Model_Query_Builder.html

erhalten oder wenn Sie Beziehungen in Ihren Modellen zwischen Marken eingerichtet haben , Produkte und Produktkategorien, können Sie das verwenden.

https://docs.phalconphp.com/en/latest/reference/model-relationships.html

0

Beispiel:

$Brands = Brands::query() 
->innerJoin("Products", "Products.brand_id = Brand.id") 
->innerJoin("ProductCategory", "ProductCategory.product_id = Products.id") 
->where("ProductCategory.group_id_1 = :group_id:") 
->bind(["group_id" => $id]) 
->cache(["key" => __METHOD__.$id] // if defined modelCache as DI service 
->execute(); 
$brandInProductCategory[$id] = []; 
foreach($Brands AS $Brand) { 
array_push($brandInProductCategory[$id], [ 
    "id" => $Brand->getId(), 
    "title_fa" => $Brand->getTitleFa(), 
    "title_en" => $Brand->getTitleEn() 
]); 
}