我正在使用一个大型数据库(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)而不是“传感器名称”来减少数据库的大小。
`Count` int(11) NOT NULL AUTO_INCREMENT,
`SensorID` smallint(5) unsigned NOT NULL,
`Date` datetime NOT NULL,
`Value` float DEFAULT NULL,
我有另一个表(“定义”)来在“sensorID”和“传感器名称”之间映射。
CREATE TABLE `definition` (
`SensorID` smallint(5) NOT NULL AUTO_INCREMENT,
`Sensor Name` varchar(100))
那么,如何才能最有效地用“sensorID”替换Sensor Name
?现在,我使用“SELECT”从旧表中选择每个的“日期”和“值”,并将其插入到带有传感器 ID 的新表中
INSERT INTO newtable (SensorID, `Date`, `Value`)
SELECT 3681, `Date`, `Value` from oldtable where Sensor Name = 'abc';
其中“3681”是我从“definition”表中获取的ID ,但 50% 的数据需要我一周的时间。 JOIN 并不理想,因为使用 20 Gb,需要大量资源才能完成。
最佳答案
首先创建新表传感器并填充其中的所有数据。
使用新表更新旧表的列数据传感器名称,如下所示。
UPDATE oldtable o INNER JOIN sensor s ON o.SensorName = s.SensorName
SET o.Sensorname = s.SensorId;
然后将oldtable的Senson Name的列名和类型更改为SensorID,如下
ALTER TABLE oldtable CHANGE Sensorname SensorId INT(11);
希望这能解决您的问题
关于mysql - 替换 MySQL 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49294347/