文章来自:https://blog.csdn.net/pengShuai007/article/details/86021689
商务合作: 请加微信 2230304070
精选文章正文
给一个线上环境的大表,如何给它加索引?
要是数据量在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做读写分离配置,这一块看具体配置文章就好了:
如何搭建MySQL(双机热备)主从复制、读写分离
保持数据同步,然后从库中进行加字段/索引,在做主从切换数据就OK了
以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持php自学中心![31c1c6aa8426f898f6c736a68a6c6354.png](https://img-blog.csdnimg.cn/img_convert/31c1c6aa8426f898f6c736a68a6c6354.png)