要是数据量在10几万以内,那你就可以直接用sql语句
ALTER TABLE table_name ADD INDEX index_name (column_list)
数据量过大时,直接执行加索引操作就会锁表,过大的表可能会达到数小时甚至导致服务崩溃.显然直接ALER表是不可取的。下面是解决该问题的方案
解决方案1
- 导出原表数据
- 创建新表与原表结构保持一致,在该表上执行alter语句添加索引;
- 将表数据导入创建的新表;
- 修改新建的表名为原表名。
具体步骤
配置数据库参数
- show variables like ‘%secure%’;查看 secure-file-priv 当前的值是什么;
- secure-file-priv为null表示禁止导出数据;
- 在my.ini配置文件中修改secure-file-priv参数;
- secure-file-priv= ,设置为空表示不做限制,修改完成重启数据库服务。
创建新表
1 创建一张新表与要添加索引的表结构保持一致;
CREATE TABLE 表名 LIKE 要复制的表名; (仅复制表结构)
2 创建需要添加的索引;
alter table ha_person_info add index IDX_OUT_ORGAN_CODE (OUT_ORGAN_CODE);
导出数据文件
该步需要在数据库部署的服务器上进行
select * from tab into outfile 'D:/mysql/tab.txt';
注意:盘符后面跟的目录文件夹必须存在,否则报不能创建文件错误;斜杠如果为\,即 D:\mysql\tab.txt,则会在mysql安装目录下的data文件夹中创建一个mysqltab.txt的文件;
如果报错:
The MySQL server is running with the --secure-file-priv option so
it cannot execute this statement
则表示数据库参数secure-file-priv配置错误
导入数据文件到新表
load data infile 'D:/mysql/tab.txt' into table tab;
上面是也就是临时表的处理方案,此方案在数据表保持不操作的情况下才能保持数据完整。也就是说此方案可能会损失少量数据
解决方案2,从库加,主从切换
首先要对MySQL做读写分离配置:
保持数据同步,然后从库中进行加字段/索引,在做主从切换数据就OK了