为什么只需更新此表以添加列需要一个多小时?该表有15M行.它有2个索引和一个主键.ALTER TABLE查询现在处于"复制到tmp表"状态1小时15分钟.
ALTER TABLE `frugg`.`item_catalog_map`
ADD COLUMN `conversion_url` TEXT NULL DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)
表:
mysql> describe item_catalog_map;
+------------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| catalog_unique_item_id | varchar(255) | NO | PRI | NULL | |
| catalog_id | int(11) | YES | MUL | NULL | |
| item_id | int(11) | YES | MUL | NULL | |
| price | decimal(10,2) | YES | | 0.00 | |
+------------------------+---------------+------+-----+---------+-------+
mysql> …Run Code Online (Sandbox Code Playgroud) 我在本地安装了InnoDB的MySQL 5.5.37和Ubuntu 13.10上的apt-get.我的机器是台式机上的i7-3770 + 32Gb内存+ SSD硬盘.对于仅包含150万条记录的表"mytable",以下DDL查询需要超过20分钟(!):
ALTER TABLE mytable ADD some_column CHAR(1) NOT NULL DEFAULT 'N';
Run Code Online (Sandbox Code Playgroud)
有没有办法改善它?我检查了
show processlist;
Run Code Online (Sandbox Code Playgroud)
它显示它出于某种原因正在复制我的表格.令人不安的是令人不安的.有没有办法关掉这个副本?是否有其他方法可以提高向大表添加列的性能?
除此之外,我的数据库相对较小,只有1.3Gb转储大小.因此它(理论上)应该100%适合记忆.
有设置可以帮助吗?迁移到Precona会改变一切吗?
补充:我有
innodb_buffer_pool_size = 134217728
Run Code Online (Sandbox Code Playgroud) 我使用此查询来选择给定表中的字段.是否可以只选择字段名而不是表的整个结构?
SHOW COLUMNS FROM student
Run Code Online (Sandbox Code Playgroud)