首页 > 数据库 >mysql千万级表数据删除方式

mysql千万级表数据删除方式

时间:2023-05-08 15:37:16浏览次数:37  
标签:10 删除 format mysql 千万级 num time select

背景:客户反应页面加载慢,半天无法刷新,经过排查发现是有张表的数据量达到了 5kw级别,因此需要删除旧的数据,保留最新半年的数据即可

删除方式:批量删除

 

1 检查表一共有多少数据

 

2 半年之内数据量检查 2021-11-07 10:06:08----2022-05-30 23:00:00

 

3 删除时如果使用delete无法全部删除这么多的数据,一次最多删除1w行数据即可

delete from su_num where st_time >= '2021-11-07 10:06:08' and st_time <= '2022-05-30 23:00:00' and num_id='1274' limit 10000;

 

4 如果手动删除比较慢,则可以使用脚本进行操作
(1) python脚本

 1 import pymysql
 2 import datetime
 3 
 4 """
 5 此方式需要安装:
 6 pip3 install pymysql==0.10.1 --trusted-host mirrors.aliyun.com
 7 
 8 说明:优化之后的删除方式
 9 1 分批删除,每次50W的数据
10 2 设置key_buffer_size从原来的8MB为目前的512MB,此参数的推荐值为 < 物理剩余内存*70%
11 
12 运行方式:/usr/bin/python3 脚本名称
13 10 18 * * * /usr/bin/python3 脚本名称.py >> ./test.logs 2>&1
14 """
15 
16 def read_file(start_time,end_time, at_num):
17     today_time = datetime.datetime.now()
18     conn = pymysql.connect(host='x.x.x.x', user='xxxx', password='xxxxx', port=xxxx, database='db_stu_num')
19     select_sql = "select * from su_num where st_time > '{0}' and st_time < '{1}' and act_id='{2}' limit 1".format(start_time, end_time, at_num)
20     delete_sql="delete from su_num where st_time > '{0}' and st_time < '{1}' and act_id='{2}' limit 500000".format(start_time, end_time, at_num)
21     number = 0
22     try:
23         with conn.cursor() as cur:
24             cur.execute("SET GLOBAL key_buffer_size = 536870912")
25             while True:
26                 comm_select = cur.execute(select_sql)
27                 print("符合条件的语句一共 {0} 条".format(comm_select))
28                 if (comm_select is None) or (comm_select == 0):
29                     break
30                 else:
31                     comm_delete = cur.execute(delete_sql)
32                     conn.commit()
33                     number += 1
34                     print("第 {0} 次删除的数据为 {1} 条".format(number, comm_delete))
35     except Exception as e:
36         conn.rollback()
37         print("报错内容为 {0}".format(e))
38     finally:
39         conn.close()
40     now_time = datetime.datetime.now()
41     print("执行操作的开始时间为: {0}".format(today_time))
42     print("执行操作的结束时间为: {0}".format(now_time))
43     print("执行操作耗时 {0} 秒".format((now_time - today_time).total_seconds()))
44 
45 if __name__ == "__main__":
46     read_file("2021-11-07 10:06:08", "2022-05-30 23:00:00", 1274)

 

(2) shell脚本

 1 #!/bin/bash
 2 
 3 dbuser='xxxx'
 4 passwd='xxxxxx'
 5 hostip='x.x.x.x'
 6 hostport='xxxx'
 7 sum_num=9187486
 8 dataname='db_stu_num'
 9 tablename='su_num '
10 mycmd="/usr/bin/mysql -u ${dbuser} -p${passwd} -h ${hostip} -P ${hostport}"
11 
12 for ((i=10000; i<=${sum_num}; i+=10000))
13 do
14     ${mycmd} -e "use ${dataname}; delete from ${tablename} where st_time >= '2021-11-07 10:06:08' and st_time <= '2022-05-30 23:00:00' and act_id='1274' limit 10000;"
15 done

 

(3) 小结:mysql删除10000条数据最快 30.65 sec  最慢 1 min 59.07 sec

 

标签:10,删除,format,mysql,千万级,num,time,select
From: https://www.cnblogs.com/fanrui/p/17381896.html

相关文章

  • mysql截取特定字符串
    今天用到了截取字符串在mysql中,特此记录一下:substring_index(str,delim,count)str是字段名,delim是特定字符串,count是从第几个开始截取,例如:selectsubstring_index(d_name,'中亿永兴光伏1期',1)fromalarm_hs......
  • MySQL中这14个神仙功能,惊艳到我了
    前言我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常的工作中,使用groupby进行分组的场景,是非常多的。比如想统计出用户表中,名称不同的用户的具体名称有哪些?具体sql如下:select name from `us......
  • 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年4月刊
    本文为大家整理了墨天轮数据社区2023年4月发布的优质技术文章,主题涵盖Oracle、MySQL、PostgreSQL等数据库的基础安装配置、故障处理、性能优化等日常实践操作,以及概念梳理、常用脚本、注意事项等总结记录,分享给大家:Oracle优质技术文章概念梳理&基础配置Oracle之嵌套循环连接(Ne......
  • MySQL连接失败解决方法can't connect to local MySQL server through socket '/tmp/my
    【报错信息】can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(111)【问题描述】新服务器上安装MySQL后无法正常启动,提示连接失败。【问题分析】出现这个问题主要是mysql配置错误,找不到mysql.sock文件【解决方法】寻找mysql.sock文件的位置,比较常见......
  • Mysql Query error: BIGINT UNSIGNED value is out of range in..解决方法(转)
    原文:https://blog.51cto.com/bstdn/19510641、问题当字段类型为unsigned时,使用相关结果为负值时就会报错,报错如下:BIGINTUNSIGNEDvalueisoutofrangein..1.2、解决使用cast()修改字段类型为signedselectcast(quantityassigned)-cast(quantity2assign......
  • Linux下面误删除文件使用extundelete工具恢复介绍
    操作系统版本:CentOSrelease6.4(Final)   软件版本:extundelete-0.2.4.tar.bz2PS:该软件恢复文件系统仅支持ext2/ext3/ext41.创建文件系统[root@zw_test_26_74/]# mkfs-text4/dev/sdb32.查看文件系统类型[root@zw_test_26_74/]#blkid/dev/sdb3 --查看文件系......
  • Linux下面误删除文件使用extundelete工具恢复介绍
    1.使用rz命令上传extundelete-0.2.4.tar.bz2到/tmp文件夹下并解压软件。1[root@localhosttmp]#tar-jxvfextundelete-0.2.4.tar.bz22.进入到extundelete解压的目录下面,执行编译安装。1234567891011[root@localhost test]#cd/tmp[r......
  • linux环境部署--MySQL5.7二进制源码文件安装
    linux环境部署--MySQL5.7二进制源码文件安装mysql-5.7.11-Linux-glibc2.5-x86_64.tar提取码:1999MySQL5.7卸载1、将安装包解压到/usr/local/sudotarzxvfmysql-5.7.11-Linux-glibc2.5-x86_64.tar.gz-C/usr/local/2、解压后为了方便后面操作可把解压后文件名修改为mysql......
  • MySQL----日期时间函数运用
    1.1获得当前日期+时间(date+time)函数:now()除了 now()函数能获得当前的日期时间外,MySQL中还有下面的函数:current_timestamp()   current_timestamplocaltime()   localtimelocaltimestamp()   localtimestamp    这些日期时间函数,都等同于now()。鉴于......
  • mysql的时间函数 1
    对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6日期和时间类型。这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:mysql>SELECTsomethingFROMtableWHERETO_DAYS(NOW())-TO_DAYS(date_col)<=......