以下最简洁的方法是什么(MySQL)

时间:2011-11-02 14:38:33

标签: mysql function optimization

我有一个包含大约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及其名称。

现在我想出了两种填充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 个答案:

答案 0 :(得分:2)

如果我要做这样的事情,我宁愿选择在需要时添加列的视图(从而避免在磁盘上的表中存储冗余数据所带来的额外开销)