#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:
Если бы я должен был сделать что-то подобное, я бы предпочел использовать представление, которое добавляет столбец при необходимости (таким образом, избегая дополнительных накладных расходов, связанных с хранением избыточных данных в таблице на диске)