Я застрял, чтобы обновить один столбец таблицы, сравнивая с другой таблицей в 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());
}
Но все мои усилия напрасны.
Пожалуйста, посоветуйте мне, как сделать процесс быстрее.
Ваш первый запрос на обновление и второй запрос на обновление делают две разные вещи. Второй запрос медленнее, потому что вы используете 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;
Других решений пока нет …