批量进行Mysql数据处理的一项工作记录以及保存一个nginx变量大全

news2024/9/23 11:21:42

一、批量进行Mysql数据处理的一项工作记录

        在使用SQL执行一起数据批量处理的时候遇到执行数速度非常慢。表temp_users是一个包含百万级的用户ID表,表user_list是一个亿级的表,因为跨库,这里使用的是federated引擎创建的结构表。根据要实现的目标,理论上要执行的SQL应该如下:

update temp_users tu, user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss is null and tu.uidss=ul.uid;

但因为数据量太大,在直接执行这个SQL的时候发现半天没有响应,基本属于走不通的理论可行的逻辑(当然或许也和我本机性能较差)。当前情况下,只能着手进行优化处理。

【1.分步先批量取出uid批量修改数据】

        查询百万级表,一次取出几百条的用户ID,使用in查询从亿级表中取出要拿到的字段数据,然后组装成几百个SQL一次性扔给数据库执行修改,首先是这个方法是可行的,但速度大概在1秒10条左右,还是比较慢,全量修改完毕需要约3天时间。

【2.直接对uid分批执行SQL】

        在1方法太慢之后,我想了想其它的办法,其中之一就是将uid在SQL中进行分批以减少一次影响的数量。总共百万级,又涉及到跨库查询,在尝试按末尾一位、二位、三位后,发现三位执行时间还可以,且不易超时。如下:

update tv_users tu,user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where SUBSTR(uidss,-3) = '100' and tu.passwordss is null and tu.uidss=ul.uid;
#受影响的行: 1521
#时间: 16.357s

        此方法确实可行。这样来看,一秒终大约能执行100条,是上面速度的10倍,应该在几个小时就能执行完毕。于是使用程序批量生成1000条SQL语句放在navicat查询下执行,

【3.使用存储函数替代批量执行】

        在2的方法凑效之后,可以考虑使用存储函数,就不需要再用程序批量生成一大堆的SQL,粘贴执行,使用存储函数更显得对MYSQL的熟练运用吧。存储函数如下:

delimiter //
drop procedure if exists doupdate;
create procedure doupdate()
	begin 
	declare i int;
    #小于100的加前补0的逻辑
	set i = 100;
	repeat 
        update tv_users tu,user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss is null and SUBSTR(uidss,-3) = i and tu.uidss=ul.uid;
        set i = i + 1;
        until i > 999
	end repeat;
end //
#调用函数
call doupdate()

【4.发现问题速度变慢】

        上面2,3都是可以使用的方法,且我在开始执行的时候也确实可行,速度也正常,但是在执行到后期发现速度越来越慢:

[SQL] update tv_users tu,user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss is null and SUBSTR(uidss,-3) = '302' and tu.uidss=ul.uid;
#受影响的行: 1514
#时间: 49.051s
[SQL]update tv_users tu,user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss is null and SUBSTR(uidss,-3) = '989' and tu.uidss=ul.uid;
#受影响的行: 1524
#时间: 162.145s
[SQL]update tv_users tu,user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss is null and SUBSTR(uidss,-3) = '990' and tu.uidss=ul.uid;
#受影响的行: 1510
#时间: 249.241s
[SQL]update tv_users tu,user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss is null and SUBSTR(uidss,-3) = '991' and tu.uidss=ul.uid;
#受影响的行: 1569
#时间: 331.324s

        在该表中,目前只有uidss有索引,但使用substr进行处理查询就没法用上uidss的主索引了(此处我进行了测试,其中还发现查询select count(*)的时候能用上这个主索引,但是查询具体字段的时候用不上)。我到是知道mysql里BTREE索引中到是有一个前缀索引,但是我这里的查询是需要对后缀进行索引才有用。当然我也可以脑洞大开想一下再加一列,这列数据刚好和uidss字段内容是反着等,从而加上索引,不过我暂时还不想去试验这个方法。

        为什么会越来越慢呢?从索引来看,此查询用不上什么索引,或者说我未建相关索引;从数据变化来看,执行到越后面,passwordss字段为null的行越来越少。其它的变化我看不出来,是不是可以推测导致查询变慢的原因是因为null字段的问题,即一开始都是大量的null的时候还好查,后面null行越为越少时查询越来越慢。NULL 并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。在B树索引中不会存储NULL值,所以如果索引的字段可以为NULL,索引的效率会下降很多。当然我这里尚未对passwordss字段加索引,但鉴于此,于是我考虑将这个passwordss字段的null值全部替换成空然后对此字段加索引进行尝试。操作后进行查询效率如下: 

[SQL]update tv_users tu force index (passwordss),user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss ='' and  SUBSTR(uidss,-3) = '001' and tu.uidss=ul.uid ;
#受影响的行: 0
#时间: 36.331s
[SQL]update tv_users tu force index (passwordss),user_list ul set tu.passwordss=ul.passwd, tu.mobiless=ul.mobile where tu.passwordss ='' and  SUBSTR(uidss,-3) = '040' and tu.uidss=ul.uid ;
#受影响的行: 1589
#时间: 134.757s

【5.其它可考虑的方法】

        上面虽然有所改善,但也只能说是有一点点吧,甚至也可以说没有什么改善。然后又有了一些想法,

#创建视图,利用视图修改
create view nopassdata as SELECT uid,passwd,mobile from user_list where uid in (select uidss from tv_users where passwordss = SUBSTR(uidss,-3) = '999');
update tv_users left join nopassdata on uid=uidss set passwordss=passwd, mobiless=mobile where passwordss='' and SUBSTR(uidss,-3) = '104';
#会有报错:[Err] 1443 - The definition of table 'nopassdata' prevents operation UPDATE on table 'tv_users'.
#创建临时表,连接临时表进行操作
create temporary table nopasstable SELECT uid,passwd,mobile from user_list where uid in (select uidss from tv_users where passwordss = '');
#整合成一个SQL:
update tv_users left join (
	SELECT uid,passwd,mobile from user_list where uid in (select uidss from tv_users where passwordss = '' limit 10);
) as nopass on uid = uidss set passwordss=passwd, mobiless=mobile where passwordss='';
#提示报错[Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' MySQL子查询不支持 limit
#于是再加一层嵌套
update tv_users left join (
	SELECT uid,passwd,mobile from user_list where uid in (select uidss from (select uidss from tv_users where passwordss = '' limit 10) as tea )
) as nopass on uid = uidss set passwordss=passwd, mobiless=mobile where passwordss='';

        写到这里,我里通过方法2已经完成了90%的数据更新了,不过所使用的方法我相信不是最优的方法,做个记录吧。

二、保存一个nginx变量大全

$arg_PARAMETER          如果在请求中设置了查询字符串,那么这个变量包含在查询字符串是GET请求PARAMETER中的值。
$args                   该变量的值是GET请求在请求行中的参数。
$binary_remote_addr     二进制格式的客户端地址
$body_bytes_sent        响应体的大小,即使发生了中断或者是放弃,也是一样的准确。
$content_length         该变量的值等于请求头中的Content-length字段的值
$cookie_COOKIE          该变量的值是cookie COOKIE的值
$document_root          该变量的值为当前请求的location(http,server,location,location中的if)中root指令中指定的值。
$document_uri           同$uri
$host                   该变量的值等于请求头中Host的值。如果Host无效时,那么就是处理该请求的server的名称。
                        在下列情况中,$host变量的取值不同于$http_host变量。
                        当请求头中的Host字段未指定(使用默认值)或者为空值,那么$host等于server_name指令指定的值。
                        当Host字段包含端口是,$host并不包含端口号。另外,从0.8.17之后的nginx中,$host的值总是小写。
$hostname               有gethostname返回值设置机器名。
$http_HEADER            该变量的值为HTTP 请求头HEADER,具体使用时会转换为小写,并且将“——”(破折号)转换为"_"(下划线)。
$is_args                如果设置了$args,那么值为“?”,否则为“”
$limit_rate             该变量允许限制连接速率。
$nginx_version           当前运行的nginx的版本号
$query_string           同$args
$remote_addr            客户端的IP地址
$remote_user             该变量等于用户的名字,基本身份验证模块使用。
$remote_port             客户端连接端口
$request_filename       该变量等于当前请求文件的路径,有指令root或者alias和URI构成。
$request_body           该变量包含了请求体的主要信息。该变量与proxy_pass或者fastcgi_pass相关。
$request_body_file      客户端请求体的临时文件。
$request_completion     如果请求成功完成,那么显示“OK”。如果请求没有完成或者请求不是该请求系列的最后一部分,那么它的值为空。
$request_method         该变量的值通常是GET或者POST。
$request_uri            该变量的值等于原始的URI请求,就是说从客户端收到的参数包括了原始请求的URI,该值是不可以被修改的,不包含主机名,例如“/foo/bar.php?arg=baz”。
$scheme                 该变量表示HTTP scheme(例如HTTP,HTTPS),根据实际使用情况来决定,
                        例如:rewrite  ^ $scheme://example.com$uri redirect;
$server_addr            该变量的值等于服务器的地址。通常来说,在完成一次系统调用之后就会获取变量的值,为了避开系统钓鱼,那么必须在listen指令中使用bind参数。
$server_name            该变量为server的名字。
$server_port            该变量等于接收请求的端口。
$server_protocol        该变量的值为请求协议的值,通常是HTTP/1.0或者HTTP/1.1
$uri                    该变量的值等于当前请求中的URI(没有参数,不包括$args)的值。它的值不同于request_uri,由浏览器客户端发送的request_uri的值。
                        例如,可能会被内部重定向或者使用index。
                        另外需要注意:$uri不包含主机名,例如 "/foo/bar.html"
当前URL= $scheme://$server_name/$url

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我这里已有的视频图像编解码方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图FPGA开发板视频输入SDI硬件均衡器LMH1219UHD-SDI GT SDI视频解串SMPTE UHD-SDI RX SUBSYSTEM SDI视频解码Video Frame Buffer WriteZynq UltraS…

大模型时代下,软件检测行业将如何发展?

大模型时代,软件测试面临着前所未有的机遇和挑战,各类产品测试领域将如何应对技术发展和时代变化? 2024年8月28日晚八点,安畅检测首席专家李龙与腾讯Tech Lead茹炳晟、中电金信质量团队负责人王壮做客人民邮电出版社创办的IT专业…

springboot集成guava布隆过滤器

1.创建springboot项目&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>2.创建guava布隆过滤器 Component public class Gua…

DexclassLoader读取dex在Android14上遇到问题

报错如下&#xff1a; 在Android 14&#xff08;API 级别 34&#xff09;及以后版本中&#xff0c;DexClassLoader 被进一步限制&#xff0c;只能用于加载只读文件中的代码。这意味着你不能再使用 DexClassLoader 来加载从应用的内部存储空间中读取的文件。 我想通过JNI来修改…

Elasticsearch 8.13.4 LocalDateTime类型转换问题

框架背景 springboot 3.3.1elasticseach8.13.4spring-data-elasticsearch5.3.1(其实只要用了springboot3.3.1 上下两个的版本都在里面绑死了) 问题描述 使用spring-data-elasticsearch操作es&#xff0c;当字段增加映射注解,其实如果是日期类型&#xff0c;你不加默认也给你…

计算机网络概述(协议层次与服务模型)

目录 1.协议层次 2.服务模型 1.协议层次 层次化方式实现复杂网络功能&#xff1a; 将网络复杂的功能分成明确的层次&#xff0c;每一层实现了其中一个或一组功能&#xff0c;功能中有其上层可以使用的功能&#xff1a;服务本层协议实体相互交互执行本层的协议动作&#xff0…

C++(Qt)-GIS开发-QGraphicsView显示在线瓦片地图

C(Qt)-GIS开发-QGraphicsView显示在线瓦片地图 文章目录 C(Qt)-GIS开发-QGraphicsView显示在线瓦片地图1、概述2、实现效果3、主要代码4、源码地址 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 &#x1f448; 1、概述 支持加载显示在线瓦片…

TD学习笔记————中级教程总结(NEW)

目录 Instance功能讲解 问题&#xff1a; 报错All ops must generate the same number of instances (have the same length Replicator功能讲解 问题&#xff1a; 视频分辨率过大 Cannot find function named:onValueChange Instance功能讲解 数据通道的长度要一致 N…

redroid搭建云手机学习笔记(一)

参考链接 通过Redroid搭建自己的云手机 docker安装 docker官网目前打不开了&#xff0c;通过官网安装的方式无法实现&#xff0c;这里需要借助镜像网站来实现docker的安装 参考链接&#xff1a;https://developer.aliyun.com/mirror/docker-ce # step 1: 安装必要的一些系统…

Dockerfile 实例

删除不需要的镜像&#xff1a;示例&#xff1a;通配符可用 [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 580260c93725 2 hours ago 4.27MB <none&…

基于python的足球比赛数据及可视化 python 足球预测

Python 足球可视化分析是使用 Python 编程语言来进行足球比赛数据分析&#xff0c;并将结果呈现为可视化图形的过程。Python 作为一种高效灵活的编程语言&#xff0c;可以用于数据处理和分析&#xff0c;同时也有丰富的可视化库。 足球比赛数据可以从各种数据来源获取&#xf…

使用 AI进行绘画初体验

大家好啊&#xff0c;我是董董灿。 AI 绘画的效果是真的不错&#xff0c;最近在查找AI相关技术文章时&#xff0c;总是会时不时的发现一些好玩的 AI 应用&#xff0c;而且大多数都是免费的。 今天就给大家介绍如何使用 MidJourney 来完成 AI 绘画的网站。 MidJourney 本身是…

解决 Linux 上的 SSH 登录缓慢问题

如果您必须等待很长时间才能看到 SSH 密码提示&#xff0c;则可能存在多种问题。要解决 SSH 登录缓慢的根本原因&#xff0c;您可以运行带有 -vvv 选项的 ssh 命令&#xff0c;该命令将向您显示 SSH 登录期间幕后发生的情况。 $ ssh -vvv user<ssh-server>以下是 SSH 登…

Windows bat脚本学习六(十六进制与十进制互转)

一、十六进制转十进制 十六进制数转十进制数相对比较简单&#xff0c;可以直接通过0x来实现。 见如下代码&#xff1a; echo off chcp 65001set taaset /a hex0x%t% echo data%hex%pause 结果&#xff1a; 二、十进制转十六进制 这个转化比较麻烦&#xff0c;没有简便的方式转…

前端面试题每日一练,测测你对JavaScript对象继承和 Object.entries() 的理解

今天的挑战题目涉及到JavaScript中的原型链 (prototype chain) 和 Object.entries() 方法的使用。我们将通过一个对象继承的例子来探索如何使用 Object.entries() 获取对象的自身可枚举属性&#xff0c;并进行处理。让我们一起分析这段代码&#xff0c;看看它会输出什么以及为什…

微服务CI/CD实践(四)Jenkins部署及环境配置

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;gitlab部署及nexus3部署 微服务CI/CD实践&#xff08;四&#xff09…

ClickHouse的安装教程

ClickHouse的安装教程 文章目录 ClickHouse的安装教程写在前面准备工作关闭防火墙CentOS 取消打开文件数限制安装依赖CentOS 取消 SELINUX 单机安装在 **node01** 的/opt/software 下创建 clickhouse 目录将下载的文件上传到 node01 的 /opt/software/clickhouse 目录下将安装文…

MFC工控项目实例之九选择下拉菜单主界面文本框显示菜单名

承接专栏《MFC工控项目实例之八选择下拉菜单添加打钩图标》 1、在主界面添加一个组合框和一个静态文本框。 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BOOL CSEAL_PRESSUREDlg::OnInitDialog() {CDialog::OnInitDialog(); ... GetDlgItem(IDC_STATIC_TYPNAME)->SetFont(&a…

通用大模型应用研究重点六:AgentOS

智能体&#xff1a;一个能够自主感知环境、做出决策并执行行动的系统。具备规划思考能力、记忆能力以及使用工具函数的能力&#xff0c;能自主完成给定任务的计算机程序。 智能体的关键组成部分包括&#xff1a; 规划&#xff08;Planning&#xff09;&#xff1a;智能体能够将…

(二)、软硬件全开源智能手表,可全面高精度采集生命体征数据,进行健康检测。(HealthyPi Move)

HealthyPi Move是一款开放式硬件设备&#xff0c;可让您高精度地跟踪所有生命体征。它不仅仅是另一款带有心率监测器的智能手表&#xff0c;它还是手腕上的完整生命体征监测和记录设备&#xff0c;可以测量心电图(ECG)、光电容积脉搏波 (PPG)、SpO₂、血压(基于手指)、EDA/GSR、…