mysql实现百万的数据快速创建索引


本文摘自PHP中文网,作者小云云,侵删。

测试数据本机一张表users有100百万条记录。在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引。但是因为数据量大的原因,索引添加可能不成功,想了很多办法,终于挖坑成功。

开始准备工作,

user表结构:

1

2

3

4

5

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导出数据的时候出现错误:

1

select * from users into outfile 'users.txt'; //users.txt文件在mysql的dat

如下图:

上网查了一下是mysql设置的权限,可以使用

show variables like '%secure%';查看 secure-file-priv 当前的值是什么?

可以看到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 的导入|导出做限制.

导出的数据必须是这个值的指定路径才可以导出,默认有可能是NULL(我这里查看的是null)就代表禁止导出,所以需要设置一下

由于我使用的是phpstudy,mysql安装路径下的my.ini文件,设置一下路径:

注意:路径名加双引号" "
重启后再次执行错误依旧.....

mysql.cnf中没有对这个参数进行设定,就说明这个参数默认便是null

所以再尝试修改mysql.cnf中的[mysqld]加入secure_file_priv =

最终如下:

再次重启mysql

可以看到users.txt生成在同级test数据库目录。。。
接着执行:

1

truncate  users;

创建索引:

1

create index name using BTREE on users(name);

索引的方式有:BTREE、RTREE、HASH、FULLTEXT、SPATIAL,这里不再赘述他们的区别,网上有很多关于这块的介绍啦

导入文件到相应表users。

1

load data infile 'users.txt' into table users;

此方式在write 锁住情况下,或对外服务暂停时使用,线上不可能直接这样玩了。

相关推荐:

MySQL创建索引和删除索引的方法

阅读剩余部分

相关阅读 >>

mysql之select、distinct、limit的使用

mysql数据库事务transaction示例讲解教程

mysql多层级结构-树搜索介绍

mysql中innodb存储引擎的详细介绍(代码示例)

讨论有关mysql备份字符集

实例讲解mysql修改开启允许远程连接

浅谈mysql清空表数据的两种方式和区别

如何操作mssql查询数据分页

mysql和redis事务的比较(图文)

mysql如何批量删除数据库中的数据

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...