MySQL两千万数据优化&迁移
技术百科
黄舟
发布时间:2017-02-21
浏览: 次 最近有一张2000W条记录的数据表需要优化和迁移。2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升。不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析。所以我需要创建一张新表,把旧表中的数据一条一条取出来优化后放回新表;
一. 清除冗余数据,优化字段结构
2000W数据中,能作为查询条件的字段我们是预知的。所以将这部分数据单独创建新的字段,对于有规则的数据合理改变字段结构,比如身份证就是varchar(18)。对于不重要的数据我们合并后存在一个结构为text的字段。
对于一些有关联的数据我们需要计算,常见的比如身份证种能获取到准确的性别,出生地、生日、年龄。
二. 数据迁移
我们从数据库中取出一条旧数据,再通过计算处理后得到想要的新数据,最后将新数据插入新表。不过在获取新数据时遇到如下问题。
-
数据量太大,无法一次获取(2000w数据扔到内存挺可怕的);
我们可以通过MySQL的limit语法分批获取。比如每次获取50000,SQL语句如下:
select * from table_name limit 15000000,50000;
通过这种方法能解决数据量太大的问题,但是随着limit的第一个参数越来越大,查询速度会慢的吓人(上面这条SQL执行会花35秒)。时间就是生命,于是
我们开始优化SQL语句,优化后变成下面这样:select * from table_name order by id desc limit 5000000,50000;
可通过二分法拆分2000W数据,当执行到1000W数据时,将数据倒序。优化后SQL执行效率显著提升,从35秒降到9秒;
不过还是很慢,时间就是生命……还好我们有自增ID(创建数据表第一条定律,一定要有自增字段),优化后的SQl如下:
1. select * from table_name where id>15000000 and id<15050000; 2. select * from table_name where id>15000000 limit 50000;
为了直观演示,我写了两条功能一样的SQL。相比第一条,第二条的limit会导致SQL的索引命中变差,效率同样也会下降。第一条SQL的执行时间是2毫秒,第二条执行时间5毫秒(我取的平均值)。每次数据的查询速度直接从35秒降到2毫秒……
-
数据量太大并且数据无法预估,某些特殊数据会导致数据导入失败;
我们有三种方案去将新数据存入新表,分别如下:
-
一条一条插入数据;
开始肯定会想这种方案一定不行,因为每次插入都会有一次数据库IO操作。但是该方案有个好处是能及时发现有问题的数据,修改后再继续执行; 在Oracle中使用『绑定变量』能带来性能提升,正好MySQL也提供了『绑定变量』的功能。于是在不改变逻辑的情况下,尝试优化数据存储速度。代码如下:
public function actionTest(array $data) { $mysqli = new mysqli("192.168.1.106", "username", "password", "test"); $sql = "insert into table_name(name,identity) values (?,?)"; $stmt = $connection->prepare($sql); $name = ""; $identity = ""; //使用绑定变量 $stmt->bind_param("si", $name, $identity); foreach($data as $val) { $name = $val[name]; $identity = $val[card_id]; //执行 $stmt->execute(); } $stmt->close(); }最后效果不怎么好,MySQL的『绑定变量』并没带来明显的速度提升,不过能有效的防止SQL注入;
-
一次插入50000条数据;
这是我最后选中的方案,一是能及时发现有问题的数据,二是导入数据非常稳定。就像支持断点续传一样,每一步都能看到效果。在执行脚本时,也能同步开始写分析逻辑;
-
组装成SQL文件,最后统一导入;
组装一个大的SQL文件,最后通过MySQL自带的工具导入也是极好的。但如果有一条SQL有问题,你可能需要重跑一次脚本。因为在9G大小的文本文件中修改一个符号是很痛苦的事情……
三. 总结
通过各种优化,最后将脚本执行时间缩短到了20分钟内。优化后数据质量得到了较高保证,下次将尝试2亿数据的优化&迁移……
以上就是MySQL两千万数据优化&迁移的内容,更多相关内容请关注PHP中文网(www.)!
# 是在
# 就像
# 也会
# 绑定
# 太大
# mysql
# 后将
# 执行时间
# 第一条
# 第二条
# 发现有
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Golang中编写异步函数测试_Golang
- c++如何使用std::bind绑定函数参数_c+
- Windows蓝屏错误0x0000002C怎么解决
- 如何诊断并终止卡死的 multiprocessin
- Windows执行文件被SmartScreen拦截
- Python lxml的etree和Element
- 如何在 Go 中判断变量是否为函数类型
- 如何使用Golang实现文件追加操作_向已有文件追
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- Python对象生命周期管理_创建销毁说明【指导】
- Mac电脑进水了怎么办_MacBook进水后紧急处
- windows如何禁用驱动程序强制签名_windo
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- MySQL 中使用 IF 和 CASE 实现查询字
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- c# 服务器GC和工作站GC的区别和设置
- 短链接怎么自定义还原php_修改解码规则适配需求【
- Python邮件系统自动化教程_批量发送解析与模板
- Bpmn 2.0的XML文件怎么画流程图
- Windows10如何重置此电脑_Windows1
- c++怎么处理多线程死锁_c++ lock_gua
- php做exe支持多线程吗_并发处理实现方式【详解
- c# 在高并发场景下,委托和接口调用的性能对比
- 如何使用Golang处理静态文件缓存_提高页面加载
- Python字符串操作教程_切片拼接与格式化详解
- C#如何使用XPathNavigator高效查询X
- Win10文件历史记录怎么用 Win10开启自动备
- c# 在ASP.NET Core中管理和取消后台任
- Win11怎么修复系统文件_使用sfc命令修复Wi
- mac本地php环境如何开启curl_curl扩展
- Win11怎么更改系统语言为中文_Windows1
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- Win11怎么关闭任务栏小图标_Windows11
- Win11怎么检查TPM2.0模块_Windows
- Win11怎样激活系统密钥_Win11系统密钥激活
- Win11怎么关闭定位服务 Win11禁止应用获取
- Win11怎么查看硬盘型号_Windows 11检
- php485返回数据不完整怎么办_php485数据
- 如何在Golang中修改数组元素_通过指针实现原地
- php串口通信波特率怎么选_根据硬件手册设置正确波
- php485函数执行慢怎么优化_php485性能提
- php嵌入式日志记录怎么实现_php将硬件数据写入
- 如何在 Django 中安全修改用户密码而不使会话
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- Win10怎样安装Excel数据分析工具_Win1
- Win11怎么查看激活状态_查询Windows 1
- Win11怎么设置指纹解锁 Win11笔记本录入指
- windows系统找不到无线网络怎么办_windo
- 如何在Golang中实现自定义Benchmark_
- 如何在Golang中引入测试模块_Golang测试

我们开始优化SQL语句,优化后变成下面这样:
QQ客服