测试数据本机一张表users有100百万条记录。在建立此表前没有未相应字段添加索引,因此此时须要为表添加索引。可是由于数据量大的缘由,索引添加可能不成功,想了不少办法,终于挖坑成功。php
开始准备工做,html
user表结构:mysql
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `add_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
尝试在navicat中使用 into outfile导出数据的时候出现错误:sql
select * from users into outfile 'users.txt'; //users.txt文件在mysql的dat
以下图:数据库
上网查了一下是mysql设置的权限,可使用测试
show variables like '%secure%';查看 secure-file-priv 当前的值是什么?spa
能够看到secure-file-priv参数是用来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪一个指定目录的。 当secure_file_priv的值为null ,表示限制mysqld 不容许导入|导出 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出作限制.3d
导出的数据必须是这个值的指定路径才能够导出,默认有多是NULL(我这里查看的是null)就表明禁止导出,因此须要设置一下code
因为我使用的是phpstudy,mysql安装路径下的my.ini文件,设置一下路径:htm
注意:路径名加双引号" "
重启后再次执行错误依旧.....
能够看到users.txt生成在同级test数据库目录。。。
接着执行:
truncate users;
建立索引:
create index name using BTREE on users(name);
索引的方式有:BTREE、RTREE、HASH、FULLTEXT、SPATIAL,这里再也不赘述他们的区别,网上有不少关于这块的介绍啦
导入文件到相应表users。
load data infile 'users.txt' into table users;
此方式在write 锁住状况下,或对外服务暂停时使用,线上不可能直接这样玩了。。