我最近继承了一个正在增长的MySQL数据库。它刚刚超过10亿条记录,其中一张表的性能非常糟糕。我想最终改变数据库,但我现在没有时间去做。
数据库的创建者决定使用BIGINT代替TINYINT或SMALLINT,选择糟糕的索引,不对表进行分区(当它真的可以使用一个)。不幸的是,每次我试图修改这个表时,它都会锁住它,并且它可以运行几天,这是我无法拥有的,因为表不断增长,需要访问。
我使用的是MySQL 5.7.5,即使我选择了‘就位’算法或者没有锁,它似乎仍然会影响性能,否则它会运行,永远不会完成,就像超时之类的。
有没有一种方法可以在不停机的情况下迅速改变一个桌子?
以下是CREATE表:
CREATE TABLE `devicelog` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`site_id` bigint(20) unsigned NOT NULL,
`system_id` bigint(20) unsigned NOT NULL,
`device_id` bigint(20) unsigned NOT NULL,
`field_id` bigint(20) unsigned NOT NULL,
`val` double DEFAULT NULL,
`valid` tinyint(1) NOT NULL,
`timestmp` datetime NOT NULL,
`unixtime` bigint(20) unsigned DEFAULT NULL,
`interval5` bigint(20) unsigned DEFAULT NULL,
`interval15` bigint(20) unsigned DEFAULT NULL,
`interval60` bigint(20) unsigned DEFAULT NULL,
`interval1440` bigint(20) unsigned DEFAULT NULL,
`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `site_id` (`site_id`),
KEY `system_id` (`system_id`),
KEY `device_id` (`device_id`),
KEY `field_id` (`field_id`,`device_id`,`system_id`,`site_id`,`valid`),
KEY `unixtime` (`unixtime`),
KEY `created_timestmp` (`created`),
KEY `timestmp` (`timestmp`)
) ENGINE=InnoDB AUTO_INCREMENT=1012220164 DEFAULT CHARSET=utf8 COMMENT='Device log.'https://dba.stackexchange.com/questions/101834
复制相似问题