Вопрос о производительности - PullRequest
0 голосов
/ 07 декабря 2010

Я буду быстр и прост в этом. По сути, мне нужно быстро и быстро объединить несколько счетов (объект).

Простая идея состоит в том, чтобы

$invoice1 = new Invoice(1);
$invoice2 = new Invoice(2);
$invoice3 = new Invoice(3);
$invoice1->merge($invoice2,invoice3);
$invoice1->save();

Поскольку каждый объект будет запрашивать свои собственные данные, количество запросов увеличивается с увеличением количества счетов, необходимых для слияния.

Однако это тот случай, когда один запрос

SELECT * FROM invoice WHERE id IN (1,2,3)

Будет достаточно, однако реализация будет не такой элегантной, как указано выше.

Первоначальные тесты для выборочных данных указывают на снижение скорости в 2,5–3 раза по сравнению с приведенным выше из-за огромного количества запросов MySQL.

Совет, пожалуйста

Ответы [ 4 ]

2 голосов
/ 07 декабря 2010

Используйте счет-фактуру.Вы просите это для счетов, используя различные методы.newest (n) get (id) get (array (id, id, id)) и т. д., и он возвращает массивы счетов или отдельные объекты счетов.

<?php
    $invoice56 = InvoiceFactory::Get(56); // Get's invoice 56
    $invoices = InvoiceFactory::Newest(25); // Get's an array of the newest 25 invoices
?>
0 голосов
/ 07 декабря 2010

Я мог бы предложить изучить фактическое ORM (реляционное сопоставление объектов), чтобы создать разделение между вашими фактическими запросами и используемыми объектами. Взгляните на Propel или (мой любимый) Doctrine (версия 2 - очень прост в использовании)

Таким образом, вы можете получить ровно столько же, сколько хотите ...

0 голосов
/ 07 декабря 2010

Убедитесь, что вы все время работаете с одним и тем же соединением БД.Убедитесь, что он не переподключается в одном потоке выполнения скрипта.

0 голосов
/ 07 декабря 2010

Не могли бы вы сделать объект Invoice ленивым и позволить merge загрузить все, что не было загружено?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...