Какой самый чистый способ из следующих (MySQL)

#mysql #function #optimization

#mysql #функция #оптимизация

Вопрос:

У меня есть огромная таблица городов, содержащая около 3 000 000 строк. Мне нужно было создать новый столбец, который содержит следующую строку:

 'City name, City name with accent, Country name'
 

Базовая схема выглядит следующим образом:

 city_id         int 
name            varchar
status          varchar
date_created    int(11)
country_id      int
accent_name     varchar
city_country    text
 

И есть таблица countries, которая содержит contry_id и его имя.

Теперь я выяснил 2 способа заполнения столбца city_country.

Попытка 1:

 delimiter //
CREATE FUNCTION getConcat(x INT(11))
    RETURNS TEXT
    READS SQL DATA
BEGIN
    DECLARE var1 TEXT;
    SELECT concat(CT.name, ', ', CT.accent_name, ', ', CR.name) AS Combined INTO var1 FROM `wp_City` AS CT LEFT JOIN `wp_Country` AS CR ON CR.country_id = CT.country_id WHERE CT.city_id = x;
    RETURN var1;
END//
UPDATE `wp_City` SET `city_country`=(SELECT getConcat(city_id)) WHERE 1;
 

Попытка 2:

Я создал новую таблицу, содержащую только один столбец:

 INSERT INTO `_myCity` (name, status, date_created, country_id, accent_name, lat, `long`, region, city_country)
    SELECT c.name, c.status, c.date_created, c.country_id, c.accent_name, c.lat, c.long, c.region, _c.name
    FROM `wp_City` as c inner join `wp_Country` _c on c.country_id = _c.country_id
 

Теперь второй способ намного быстрее, но который чище? Вышеуказанное будет выполнено только один раз, поэтому вопрос просто из любопытства. Если есть лучшие способы достижения этого, пожалуйста, поделитесь!!

Заранее благодарю вас.

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

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

Ответ №1:

Если бы я должен был сделать что-то подобное, я бы предпочел использовать представление, которое добавляет столбец при необходимости (таким образом, избегая дополнительных накладных расходов, связанных с хранением избыточных данных в таблице на диске)