MySQL неэффективное обновление перекрестной таблицы между 3 таблицами

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь перенести устаревшую базу данных (без первичных ключей) в лучшую и более структурированную базу данных в MySQL.

Я выполняю этот запрос:

 UPDATE table a, table b, table c 
SET a.item_id = b.id 
WHERE b.description = c.description AND a.id = c.id;
 

a.item_id и b.id являются обоими int(11) полями, и b.description и c.description являются обоими varchar полями. b.description . и c.description у них нет никаких ключей или индексов. a.id и c.id оба являются первичными ключами.

Таблица a и таблица c — это обе таблицы с 50 000 ~ строк, а таблица b содержит около 2000 строк. В результате выполнение инструкции triple join занимает много времени. Я почти уверен, что делаю это неэффективно, так что было бы более эффективным способом структурирования запроса?

Комментарии:

1. оооочень много таблиц, почему бы не попробовать использовать явное соединение

2. Явное объединение плюс индексирование полей описания.

3. Чего вы пытаетесь достичь с помощью этого запроса? Пожалуйста, объясните свою логику.

Ответ №1:

Во-первых, вы должны написать это, используя join синтаксис:

 UPDATE table a join
       table c
       on a.id = c.id join
       table b
       on b.description = c.description
    SET a.item_id = b.id ;
 

Это не должно влиять на производительность. Тем не менее, вы должны включить индекс description . Я бы предложил:

 create index on b_description_id on b(description, id);
 

Комментарии:

1. есть ли причина, по которой я должен явно использовать синтаксис соединения? синтаксис запятой не подразумевает объединение?

2. @user3705002 . . . Синтаксис запятой a cross join . В большинстве случаев это не то, чего вы действительно хотите. Лучше быть явным. Кроме того, вы не можете выразить внешние соединения с этим синтаксисом (по крайней мере, не понятным способом).

Ответ №2:

Вы могли бы изменить предложение WHERE, чтобы оно проверяло значение INT перед VARCHAR, что облегчает сравнение и уменьшит размер подмножества для сравнения описания.

 UPDATE table a, table c, table b
SET a.item_id = b.id 
WHERE a.id = c.id AND b.description = c.description;