Оптимизация (My) SQL-запроса - PullRequest
0 голосов
/ 03 апреля 2010

Я обычно использую ORM вместо SQL, и я немного не в курсе различных JOIN-соединений ...

SELECT `order_invoice`.*
     , `client`.*
     , `order_product`.*
     , SUM(product.cost) as net 
  FROM `order_invoice` 
  LEFT JOIN `client` 
    ON order_invoice.client_id = client.client_id 
  LEFT JOIN `order_product` 
    ON order_invoice.invoice_id = order_product.invoice_id 
  LEFT JOIN `product` 
    ON order_product.product_id = product.product_id 
 WHERE (order_invoice.date_created >= '2009-01-01') 
   AND (order_invoice.date_created <= '2009-02-01') 
 GROUP BY `order_invoice`.`invoice_id`

Таблицы / столбцы являются логическими именами ... это приложение типа магазина ... запрос работает ... просто очень, очень медленно ...

Я использую Zend Framework и обычно использую Zend_Db_Table_Row::find(Parent|Dependent)Row(set)('TableClass'), но мне нужно сделать много соединений, и я подумал, что это повысит производительность, выполнив все в одном запросе вместо сотен ...

Могу ли я улучшить вышеуказанный запрос, используя более подходящие JOIN или другую реализацию? Большое спасибо.

1 Ответ

1 голос
/ 03 апреля 2010

Неправильный запрос, неверный GROUP BY. Все столбцы в части SELECT, которые не входят в составную функцию, должны быть в GROUP BY. Вы упоминаете только один столбец.

Измените режим SQL, установите для него ONLY_FULL_GROUP_BY .

Когда это будет сделано и у вас будет правильный запрос, используйте EXPLAIN, чтобы узнать, как выполняется запрос и какие индексы используются. Затем начните оптимизацию.

...