mysql用update select批量处理数据

接手了一个项目,在实际的使用中发现服务器的负载很高! 于是在服务器上使用 Top 命令查看CPU和内存的使用情况,发现mysql占用的CPU最高。于是去查看了mysql的慢日志,不知道慢日志文件在哪的可以通过show variables like ‘%slow_query_log%’ 的sql语句查看。

查看了慢日志文件,发现大部分的记录都指向同一个查询:

 select c.*,t3.id as cl_id,t3.start_time,t3.duration,t3.status as call_log_status from `customer` c LEFT JOIN (SELECT t2.* FROM (SELECT cl.customer_id,max(cl.id) AS cl_id FROM call_logs cl WHERE cl.`user_id` = xxxGROUP BY cl.customer_id) AS t1 INNER JOIN call_logs t2 ON t2.id = t1.cl_idWHERE t2.id > 0 ) AS t3 ON t3.customer_id = c.customer_id where c.`user_id` = xxx

这大致就是之前的sql,要获取的就是客户表的信息和客户对应通话记录表最新一条的通话记录的时间和通话状态。因为客户表和通话记录表为一对多的关系,之前的开发人员就用group by和max来获取了每个客户的最新通话记录,EXPLAIN分析一下这个sql语句,索引都加上了,查询效率也还是很低。因为列表查询中还有筛选字段是需要筛选最新通话记录的状态,所以也没办法单独查出客户再去遍历。

于是就想到了,在客户表中增加一个冗余字段,记录这个客户最新通话记录的ID,这样就可以省去查询效率较低的group和嵌套查询。

alter table customer add `last_call_log_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最新通话记录ID';

但光添加字段还不能用,需要先把数据都跑一遍,让这个新添加的字段存储上我需要的信息,于是就用update select的方式来处理了。

UPDATE customer c
SET c.last_call_log_id = (SELECT t2.`id` as last_call_log_idFROM (SELECT cl.customer_id,max(cl.id) AS cl_id FROM call_logs cl GROUP BY cl.customer_id ) AS t1 INNER JOIN call_logs t2 ON t2.id = t1.cl_idWHERE t2.customer_id = c.customer_id
);

在实际运行的时候发现,有些客户没有通话记录的时候会导致数据为空报错,就又修改了下,加上了IFNULL作为判断:

UPDATE customer c
SET c.last_call_log_id = IFNULL((SELECT t2.`id` as last_call_log_idFROM (SELECT cl.customer_id,max(cl.id) AS cl_id FROM call_logs cl GROUP BY cl.customer_id ) AS t1 INNER JOIN call_logs t2 ON t2.id = t1.cl_idWHERE t2.customer_id = c.customer_id
),0);

跑完数据后,就可以通过直接关联的方式来获取客户的最新通话记录信息了。如果上述操作中有什么问题或者有更好的办法也欢迎大佬指出。

但在尝试的过程中,也遇到了个问题,在网上查询update select的教程时,发现可以通过如下这种写法同时set多个字段,但在实际尝试后发现不可行,一直在报错。

UPDATE <table_name> <alias>
SET (<column_name>,<column_name> ) = (
SELECT (<column_name>, <column_name>)
FROM <table_name>
WHERE <alias.column_name> = <alias.column_name>)
WHERE <column_name> <condition> <value>;

mysql用update select批量处理数据相关推荐

  1. Mysql中update select更新数据,insert ignore into

    在mysql中一般更新我们都是通过 update set指定的值,但是有些时候,我们数据库中存在一些记录,这时候我们希望用已有数据库中的记录来进行更新,这时候我们可以通过mysql的update se ...

  2. C mysql批量写入_使用JDBC在MySQL数据库中快速批量插入数据

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: Adds a set of ...

  3. 用python操作mysql数据库(之批量插入数据)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn = MySQLdb.connect(host='127. ...

  4. mysql mongodb批量操作_mongodb批量导入数据

    mongodb 命令行可以把sql文件批量导入数据,首先把sql文件加工称如下格式 zip.sql源文件 INSERT INTO POST(id,PostNumber,Province,City,Di ...

  5. MySQL实现update select语句

    多次用到的sql 每次找文档都找好久 sql如下 UPDATE `user` AS A INNER JOIN (SELECT id FROM `user` WHERE `sid`=2) AS B ON ...

  6. MySQL 通过子查询批量插入数据

    1 需求 需要将 a 表的数据插入 b 表,其中 a 表的数据很多是冗余的,是原始的多级分类数据,b 表相当于是对 a 表的简化,去掉冗余的数据,两表的 pdm 如下图: 2 方法 将 a 表的各级编 ...

  7. MySQL 09 DQL → select 初识查询数据和别名的使用

    4.1 DQL → select 查询数据和别名的使用 DQL:Data Query LANGUAGE(数据查询语言) 所有的查询操作都用它 select 简单的查询,无论多么复杂的查询它 都可以做到 ...

  8. mysql中update多条相同数据时,如何只做到只更新其中一部分?

    这个问题就非常有意思了,不常遇到,遇到的话网上也是各种瞎说. 假如有如图所示的一个表,在没有id字段的情况下,怎样做到只更新第三条,而不更新前两条. 在mysql 5.7 community上已经尝试 ...

  9. mysql update 批量修改数据_MySQL 中实现数据的批量修改

    今天遇到一个数据的批量更新,查了一下官方文档,还好找到了.英文东东,大家耐心哈 http://dev.mysql.com/doc/refman/5.7/en/update.html 一般在使用数据编辑 ...

最新文章

  1. python with上下文管理
  2. idea使用ant将wsdl文件_文件曝光:奔驰GLC将使用E级同款1.5T发动机
  3. c语言中调整颜色的函数_C语言中的输入输出函数
  4. 微信有电脑客户端吗_微信电脑版有多难用,你们真的没感觉吗
  5. 5G新基建边缘计算乘风破浪
  6. moodle php代码解读_Moodle插件开发笔记
  7. python cox回归_TCGA+biomarker——多因素Cox回归
  8. 数据仓库建设之总线矩阵/总线架构
  9. matplotlib如何绘制网格线
  10. 机器学习:线性回归以及非线性回归
  11. 源码扫描工具Fortify SCA和FireLine对比说明
  12. php5.6 php-fpm nginx安装和配置
  13. ubuntu下好用的翻译软件
  14. 派学车融资、YY学车倒闭,互联网驾培旱涝两重天
  15. transform: translate(-50%,-50%)导致的像素(前端页面字体模糊)模糊问题解决办法
  16. Android 内存优化实践与总结
  17. java怎么爬网易云_Python爬虫爬取网易云的音乐
  18. echarts画立体圆柱形图表
  19. Mybatis - 一对多/多对一映射
  20. PID控制器的传递函数推导

热门文章

  1. 基于python的文件加密传输_python 利用Crypto进行AES解密加密文件
  2. 微信聊天记录没有备份可以恢复吗?吐血整理分享
  3. 第十七届全国大学生智能车竞赛 华南赛区竞赛(线上)事宜通知
  4. 蚂蚁金服微贷事业群电话面试分享
  5. 仿淘宝商品详情页[带有视频和图片的轮播功能]
  6. 三款免费杀毒软件+clamAV
  7. 关于NC6.X企业报表取不了数的问题及其解决方法。
  8. Revit二次开发—载入族并交互式放置
  9. SudaMod-81.0 / crDroidAndroid-8.1(android-8.1.0_r20)红米3 2018年5月3日更新
  10. 洛谷 P1293 班级聚会