我正在使用大型数据库(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需要大量资源才能完成。
答案 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;
我希望这能解决你的问题