有一张约 200 万行的表,
修改表 xxx 添加 yyy smallint 默认 0花费了很长时间,其当前状态是将数据复制到 tmp 表。该表使用 innodb,有几个索引。tmp_table_size=4G 且 max_heap_table_size = 4g,为什么要花这么长时间?如何加快速度?
答案1
在 Jeremy Zawodny 和 Peter Ziestev 合著的《高性能 MySQL》第二版一书中,有一种向表中添加列的高速但高风险的方法,无论表大小如何。它大致如下:
方法 1
假设db是xxx所在的数据库
步骤1. CREATE TABLE zzz LIKE xxx;
步骤 2. ALTER TABLE zzz add yyy smallint default NULL; -- 暂时不使用 0
步骤3.在操作系统中执行以下操作
服务 mysql 停止
cd /var/lib/mysql/db
mv xxx.frm xxxold.frm
cp zzz.frm xxx.frm
服务 mysql 启动
步骤 4. 尝试查看 xxx 是否可以访问
如果这不起作用请尝试这个:
方法 2
步骤1. CREATE TABLE zzz LIKE xxx;
步骤2. ALTER TABLE zzz add yyy smallint default 0;
步骤3. INSERT INTO zzz (col1,col2,...colN) SELECT col1,col2,...colN FROM xxx;
步骤4.ALTER TABLE xxx RENAME jjj;
步骤5. ALTER TABLE zzz RENAME xxx;
第二种方法一定有效。第一种方法是我提到的那本书推荐的。
尝试一下吧!!!
PS 在尝试第一种方法之前,请备份所有内容(LVM 快照)