#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;