2010-02-22 2 views
0

Запрос:Насколько опасен этот SQL-запрос?

UPDATE 
    node as n 
    right join content_type_product as c 
    on n.nid = c.nid 

    right join uc_products as p 
    on p.nid = n.nid 

    set 
     c.field_product_price_eur_value = p.sell_price * 0.0961, 
     c.field_product_price_zar_value = p.sell_price * 1, 
     c.field_product_price_gbp_value = p.sell_price * 0.0844, 
     c.field_product_price_usd_value = p.sell_price * 0.1305, 
     n.changed = now() 
    where n.type = 'product' 

Для тех, кто не понял его, этот запрос обновляет все узлы на сайте Drupal для всех иметь последнюю валюту. Мой вопрос, насколько опасен этот запрос, если у вас есть:

  1. 500 Узлов
  2. 50 000 узлов
  3. 1 000 000 Узлов

Если эта команда выполняется каждый час?

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

Сайт, где это будет выполняться будет иметь несколько узлов и этот запрос обновил 2 строки для каждого 1 продукта. Итак, я не уверен, насколько это сильно повлияет на сервер, если у меня будет множество узлов.

+0

Какая у вас СУБД? – Lucero

+0

Вопрос, который сразу приходит мне в голову, это то, что произойдет, если он прервется ... –

+0

База данных = MySQL (я запускаю Drupal) И если это прерывается, это не конец света, поскольку он работает каждый час , Вопрос в том, будет ли он убивать сервер (т. Е. Использовать слишком много обработки), если есть 1 000 000 узлов)? Имейте в виду, это обновление продуктов, и на сайте может быть много и много продуктов. – coderama

ответ

10

Я бы предложил сравнить это в тестовой среде (у вас есть тестовая среда, правильно?), Чтобы приблизиться к какой нагрузке ваш сервер будет испытывать. Очень сложно угадать, какое влияние это будет иметь, не зная больше о вашей среде.

Чтобы улучшить ваше приложение, я бы предложил хранить обменные курсы в отдельной таблице и вычислять их, когда пользователи подтягивают определенный продукт. Таким образом, вам не нужно обновлять миллионы строк, когда только несколько чисел действительно изменились. Вы можете даже обновлять свои курсы обмена каждые несколько минут, а не каждый час, при желании.

+0

Это 100%. У вас есть избыточность в обменных курсах в каждом продукте - хотя при вычислении фактической цены в контроллере будет немного больше времени, вам следует серьезно подумать о том, чтобы выбросить избыточные данные в новую таблицу, чтобы вам не пришлось обновлять миллионы продуктов каждый раз, когда обменные курсы меняются вообще. –

+0

Как я могу подобрать 1 000 0000 продуктов, не создавая при этом 1 000 000 продуктов? На drupal? Я согласен, тестировать его было бы лучше всего, но мне не нравится идея создания стольких поддельных данных. – coderama

+1

@ RD: Это не поддельные данные, это тестовые данные. В тестовой среде. * Что у вас есть, правильно? * –

2

Это, несомненно, довольно здоровый призыв к созданию.

Я предполагаю, что это обновление цен на товары в соответствии с последними курсами обмена валюты. 1 000 000 узлов - это много, но если у вас несколько тысяч обращений в секунду, это может привести к нескольким миллионам вычислений, если это будет сделано «на лету».

Моя единственная рекомендация - настроить фильтрацию только для обновления «активных» продуктов. То есть продукты, которые видны для общественности. Если продукт делает изменения от неактивного к активному, он должен собрать соответствующую цену в это время.

+0

Это дало мне представление. Что делать, если каждый раз, когда продукт просматривается, он обновляется? Хммм. Это может сделать трюк. – coderama

1

Это таблица InnoDB или MyISAM? Если MyISAM блокирует всю таблицу для всего запроса, это блокирует все чтения в течение значительного времени.

Сам вопрос в порядке. Я думаю, но проверьте его с помощью EXPLAIN, чтобы убедиться, что у вас есть соответствующие индексы.

Вы также можете рассмотреть возможность использования vid и обновить только последнюю версию своих узлов.

1
c.field_product_price_zar_value = p.sell_price * 1, 

Ну, эта часть является пустой тратой ресурсов, цена * 1 = цена. Фактически, поскольку вы каждый раз обновляетесь по установленной сумме, я не уверен, что запрос делает все, что вам нужно. В общем, я бы никогда не подумал об обновлении всех цен, которые у меня есть по расписанию, если нет изменений, которые требуют их изменения. В вашем запросе нет ничего, что указывало бы на то, что произошло какое-либо изменение, так что это произойдет, изменится ли значение валюты (и то, как это будет написано wowl, измените значения, даже если валюта не изменилась).Или я не вижу часть вашего процесса?