За последние 24 часа нас посетили 18750 программистов и 1705 роботов. Сейчас ищут 670 программистов ...

тормозит выгрузка XML заказов самописная...

Тема в разделе "MySQL", создана пользователем Roman_SE, 28 окт 2009.

  1. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    тоесть мы из $result просто считываем пока там строчки не кончатся, разве не так?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Вот чтобы не задавать глупых вопросов, а точно видеть что и где у тебя повторяется...
    нужно было поставить xdebug и сделать профайлинг.

    А ты сидишь и гадаешь на кофейной гуще....
    А давайте мы еще эту лапку оторвем... Жужжжит мушка...
    Оторовем-ка еще бошку.... О! Не жужжжит мушка...


    Я знаю что у тебя там тормозит, но делать твою работу за тебя я не буду.
    В общем, как только захочешь решать этот вопрос - читай что я написал и непонятное спрашивай.
    А помогать тебе гадать.... я пас.
     
  3. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    поставил уже, только не знаю с какими параметрами его стартовать xdebug.profiler_enable =1 хватит? :)
     
  4. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    $attributes_query = tep_db_query("select products_options, products_options_values, options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = $ordernummer and orders_products_id = '" . (int)$orders_products['orders_products_id'] . "'");

    профайлер грит что мы эту строчку вызываем 226 раз, со средним временем 13ms и в итоге она самая весомая, хм, ее разве можно к основному запросу подклеить? Она же на каждую позицию в заказе отдельно вызывается. Иначе как выяснить что атрибуты именно этой позиции?
     
  5. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    а табличка к которой он обращается ABLE_ORDERS_PRODUCTS_ATTRIBUTES, сама по себе 277000 записей, с текстовыми значениями...
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Ее можно переделать.
    Так чтобы она вытаскивала не 1 order_id за раз. А все сколько тебе надо.

    Тогда ее достаточно будет вызвать 1 раз не в цикле.
     
  7. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    тоесть тормозит не в назначениях переменных и не в fetch_arrow а конкретно запрос к mysql... вот вопрос как бы его сделать 1 раз
     
  8. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    я как бы мозгом это понимаю, но оформить не могу :) фишка с джоином не прокатывает :) тоесть ей сразу надо 2 поля сопоставлять
     
  9. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    может поможете все таки ? или хотя бы пример покажете где глянуть?
     
  10. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    select * from orders_products op, orders_products_attributes pa where pa.orders_products_id=op.orders_products_id and pa.orders_id=op.orders_id

    в принципе вот такой запрос делает 277тыс строк, и по идее в нем все есть...
     
  11. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    SELECT *
    FROM orders_products op, orders_products_attributes pa
    WHERE pa.orders_id = op.orders_id

    А вот такой делает и вовсе 677тыс строк...
     
  12. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    Вот как его в массив запихать, и распарсить по логике заказ-продукт-атрибут
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    ты перед этим одним запросом получил свою 1000 order_id.

    Теперь тебе нужно взять их в массив.
    и сделать второй запрос с таким условием

    WHERE order_id IN (' . implode(',', $arrOrderId) . ')

    У тебя выберется только та информация, которая нужна к первому запросу.
     
  14. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Получившиеся результаты сохраняешь в 2хмерный массив

    $resultOrder[$orderId][] = $row

    Все.

    Теперь бежишь по первому массиву. Берешь оттуда order_id
    из второго массива достаешь нужные тебе поля и заносишь в строку для xml

    Итого у тебя ровно 3 цикла.
     
  15. Roman_SE

    Roman_SE Активный пользователь

    С нами с:
    28 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    Дык они же вложенные, как тут...
    Order
    Order
    Order->Product
    ->Product
    Product-Attributes 1-2-3-4
    Вобщем спасибо конечно. Но логику то я понимаю, написать это не могу :(