Mysql обновить один столбец таблицы на основе другой таблицы Большой объем данных

Я застрял, чтобы обновить один столбец таблицы, сравнивая с другой таблицей в php / Mysql. Я пытался ускорить процесс путем индексации столбцов таблицы, оптимизации запроса и т. Д., Но не смог ускорить процесс.

В моем приложении на основе PHP есть две таблицы (таблица A и таблица B), я хочу обновить один столбец таблицы A, сравнивая с таблицей B (с двумя столбцами — имя & ы).

Ранее описанный выше процесс занимал максимум 15 минут, чтобы обновить 28 тыс. Продуктов. Но теперь обе таблицы (таблица A и таблица B) имеют 60 тыс. Строк. Теперь это занимает больше двух часов. Я использовал ниже запрос

mysql_query("UPDATE tableA a
JOIN tableB b ON a.product_code_sku = b.sku
SET a.is_existing_product = '1'") or die(mysql_error());

mysql_query("UPDATE tableA a
JOIN tableB b ON a.product_name = b.product_name
SET a.is_existing_product = '1'") or die(mysql_error());

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

$query_result = mysql_query("SELECT t1.`id`,t2.`product_id` FROM `tableA` t1,
`tableB` t2 where (t1.product_code_sku = t2.sku
or t1.product_name = t2.product_name)") or die (mysql_error());
while($result_row = mysql_fetch_array($query_result))
{
mysql_query("UPDATE `tableA` SET is_existing_product = '1'
where id = '".$result_row['id']."' ") or die (mysql_error());
}

Но все мои усилия напрасны.

Пожалуйста, посоветуйте мне, как сделать процесс быстрее.

2

Решение

Ваш первый запрос на обновление и второй запрос на обновление делают две разные вещи. Второй запрос медленнее, потому что вы используете OR для сравнения.

Можно рассмотреть возможность создания временной таблицы для сравнения и вставки обновления обратно в таблицу A.

Прежде всего, вы должны проверить выполнение для двух запросов соединения, как

desc select a.id
from tableA a
join tableB b ON a.product_code_sku = b.sku;

Если это причина, по которой обновление происходит медленно, вам следует оптимизировать запрос.
В противном случае вы можете попробовать следующее:

Например (при условии ID первичного ключа),

// make sure the columns are in the same data type
create table tmp_sku (
id .. // just the primary key, make sure is using the same data type as in tableA
);

// do a insert into this temporary table
insert into tmp_sku select a.id
from tableA a
join tableB b ON a.product_code_sku = b.sku;

// now we have list of matches,
// then do a insert .. duplicate key update
// by comparing the primary id
insert into tableA (id, is_existing_product)
select tmp_sku.id, 1 from tmp_sku
on duplicate key set is_existing_product = 1;

// repeat for the product name
truncate tmp_sku;
insert into tmp_sku
select a.id
from tableA a
join tableB b ON a.product_name = b.product_name;

// repeat the duplicate .. update
insert into tableA (id, is_existing_product)
select tmp_sku.id, 1 from tmp_sku
on duplicate key set is_existing_product = 1;
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector