替换MySQL中的列

时间:2018-03-15 08:12:20

标签: mysql

我正在使用大型数据库(20 Gb)。结构是这样的:

  `Count` int(11) NOT NULL AUTO_INCREMENT,
  `Sensor Name` varchar(100) NOT NULL,
  `Date` datetime NOT NULL,
  `Value` decimal(18,4) DEFAULT NULL

现在,我正在测试通过使用'sensorID'(int)而不是'Sensor Name'来减小数据库的大小。

 `Count` int(11) NOT NULL AUTO_INCREMENT,
  `SensorID` smallint(5) unsigned NOT NULL,
  `Date` datetime NOT NULL,
  `Value` float DEFAULT NULL,

我有另一个表('definition')来映射'sensorID'和'Sensor Name'。

CREATE TABLE  `definition` (
  `SensorID` smallint(5) NOT NULL AUTO_INCREMENT,
  `Sensor Name` varchar(100))

那么,我怎样才能用最高效的'sensorID'替换Sensor Name?现在,我正在使用“SELECT”来自旧表的每个“日期”和“值”,并使用sensorID将其插入新表

INSERT INTO newtable (SensorID, `Date`, `Value`)
    SELECT 3681, `Date`, `Value` from oldtable where Sensor Name = 'abc';
带有'3681'的

是我从'definition'表中得到的ID ,但50%的数据需要一个星期的时间。 JOIN不是很理想,因为20 Gb需要大量资源才能完成。

2 个答案:

答案 0 :(得分:1)

您可以将SensorID列添加到现有表中。然后在该表上运行更新。类似的东西:

update SensorData s1, SensorData s2 SET s2.SensorId = s1.Id where s1.Id = s2.Id;

但请加入另一张桌子以获得真正的SensorID(这只是概念)。如果整个表上的更新需要太多性能,请批量调用此查询并限制其运行几次。

答案 1 :(得分:1)

首先创建新表传感器并填充其中的所有数据。

使用新表格更新旧表格的列数据传感器名称,如下所示。

verticalLayout {
    radioGroup {
        orientation = LinearLayout.HORIZONTAL
        radioButton {
            id = RADIO_SECOND
            text = "second(s)"
        }.lparams(width = wrapContent, height = wrapContent, initWeight = 0.25F)
    }
}

然后将oldtable的 Senson Name 的列名和类型更改为SensorID,如下所示

UPDATE oldtable o INNER JOIN sensor s ON o.SensorName = s.SensorName
SET o.Sensorname = s.SensorId;

我希望这能解决你的问题