2015-04-21 3 views
5

У меня есть таблица из 10000 продуктов в моей базе данных MySQL. Я хотел бы обновить все записи самым быстрым способом. Я использую Laravel с MySQL.Обновление большой таблицы MySQL

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

Я хотел бы обновить этот стол самым быстрым способом. Что мне делать?

UPDATE

Я использую Laravel модель, как показано ниже

DB::table('products')->where('product_id',$product_id)->limit(1)->update(array('prodcut_quantity' => $prodcut_quantity)); 
+0

Обновите их все в одном заявлении? Если вы делаете одно обновление за раз, это займет кровавый прогноз. – Andrew

+1

Что такое команда обновления, которую вы используете? –

+0

Пожалуйста, покажите нам, какой код вы используете, чтобы мы могли помочь. –

ответ

1

Я хотел бы создать цикл, который добавляет первичный ключ и количество продукта в массиве затем сделать DB::insert и ввести INSERT ON DUPLICATE UPDATE запрос (например, как показано ниже), заменяя значения с теми, в массивах:

$array = array(
    '1,1', //product_id,product_quantity 
    '2,2', 
    '4,12', 
); 

DB::insert('INSERT INTO products (product_id,product_quantity) VALUES (' . implode('),(', $array) . ') ON DUPLICATE KEY UPDATE product_quantity=VALUES(product_quantity)'); 

Этот запрос будет пытаться установить INSERTproduct_id и product_quantity в таблицу products. Поскольку product_id уже существует, запрос изменяется на UPDATE, и мы сопоставляем то, что мы хотим, чтобы столбец product_quantity был.

+1

Несмотря на выбранный ответ, этот подход ** не является самым быстрым способом выполнения обновления с использованием Laravel (или чего-либо еще). Любой, кто приходит из Google и приходит к этому ответу, должен иметь это в виду. Это также полный анти-шаблон, и он просто добавляет накладные расходы без причины, нет ничего плохого в том, что вы выполняете простое обновление и обертываете несколько из них в одной транзакции, чтобы сделать его быстрее (потому что так мы делаем вещи быстрее - мы используем один вход вывода для записи большого количества данных на диск, поэтому hdds может похвастаться измерением полосы). –

+0

Спасибо @ N.B. за ваш ответ. Не могли бы вы показать нам более быстрый способ? –

+0

Если я не ошибаюсь, есть два ответа, которые расскажут вам, как это сделать быстрее. Кроме того, есть комментарии, которые говорят вам, как сделать это быстрее. Если вы ловите рыбу для копирования/вставки, которую вы можете использовать, я боюсь, что вы ее не получите. –

0

Самым лучший и быстрый способ заключается в использовании команды обновления однострочных в интерфейсе управления базами данных (как PHPMyAdmin) в таким образом:

UPDATE product SET ... 

Я использовал его для 1 млн. повторно шнур до и получить результат через 10 секунд.

+0

Спасибо @hamed за ваш ответ. Вы говорите о построении SQL Query, используя цикл, а затем выполните этот запрос? –

+0

Добро пожаловать. Нет, не нужно использовать цикл. Вы можете обновить таблицу только ** одним запросом ** в интерфейсе управления базой данных (не внутри вашего проекта). – hamed

+0

Но я хотел бы обновить свой проект. –

2

Производительность чаще всего зависит от дизайна таблицы, чем от ее выполнения. Убедитесь, что таблица правильно проиндексирована и использует эффективный механизм хранения данных и убедитесь, что ваши данные нормализованы. Как указано в комментариях, убедитесь, что вы используете только один запрос на обновление, а не несколько (или, по крайней мере, несколько инструкций, которые вы можете использовать). Если вы ищете оптимизацию кода, тогда вам нужно будет опубликовать кое-что для нас, для работы. Если вы сможете опубликовать данные о дизайне стола, индексах и механизмах хранения, это также поможет.