问题描述:

由于业务需求,需要删除一些重复数据。即删除openid对应的2条数据,最终只保留一行。

MySQL数据库,sql语句比较简单:删除数据前,备份数据是必须的!

先来错误的演示:

1.先把错误数据查询出来

SELECT

id,

openid,

COUNT(*) as recCount

FROM tb_wx_user_info_bak

GROUP BY openid

HAVING COUNT( * ) > 1

2.根据要删除的数据的ID,进行删除

DELETE FROM tb_wx_user_info_bak WHERE id IN

(

SELECT

id,

openid,

COUNT(*) AS recCount

FROM tb_wx_user_info_bak

GROUP BY openid

HAVING COUNT( * ) > 1

)

一看就会,一做就废。

执行了上面的sql,果然,把sqlyog客户端的操作界面卡住了。

于是再开了个新的窗口。也不知道这个sql要执行多久,只能等着了。

3小时过后,这个sql窗口还是老样子,也不知道删除成功了多少数据。

在新的窗口中查询数据表,还是一样的数据量,应该是在卡住的窗口删除了一些数据但是没有提交,因此在新的窗口,数据量没有变化。

*****

在等待的时间中,想了想卡住的原因:

1.目标数据库表,同时执行新增数据与删除数据。

2.表的内存不足

3.删除语句没有使用索引。

4.删除数据的sql太差,一次删除的数据量太大(76330)

和同事请教后,得到建议:

1.优化sql

--建立要删除的数据ID构成的临时表id_temp

id:自增主键,id_data:要删除的数据ID

--把要删除的数据的ID插入表id_temp

Insert into id_temp(id_data) ( SELECT id FROM tb_wx_user_info_bak GROUP BY openid HAVING COUNT( * ) > 1 )

--把id_temp表中的id_data字段作为参数传给删除的sql

DELETE FROM tb_wx_user_info_bak WHERE id IN ( select id_data from id_temp where id > 0 and id < 5000 )

每次只删除5000条数据。避免批量处理导致MySQL无法处理数据的问题。

2.要优化具体的sql,需要结合实际场景。

譬如,要模拟大量用户操作一张表的数据,从而实现同时删除数据和插入数据到表中的情景。

达到了上述条件,再对sql的每一部分进行优化,了解sql的性能瓶颈在哪一块。

以上面的sql为例:

DELETE FROM tb_wx_user_info_bak WHERE id IN ( select id_data from id_temp where id > 0 and id < 5000 )

该sql的性能瓶颈可能处于子查询中,要解决查询的性能瓶颈,可以从索引入手,建立索引提高查询效率。

修改好sql以后,发布服务器操作记录

实际操作记录

[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]# ./app.sh startDev
-bash: ./app.sh: Permission denied                                   ###错误1:缺少操作权限
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]# sudo ./app.sh startDev
sudo: ./app.sh: command not found
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]# chmod +x app.sh
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]#
---[unicorn@unicomm auaa-audit]# sudo ./app.sh startDev
sudo: unable to execute ./app.sh: No such file or directory          ###错误2:编码格式错误
[unicorn@unicomm auaa-audit]# pwd
/u02/auaa-audit/tmp/auaa-audit
[unicorn@unicomm auaa-audit]# file -i app.sh
app.sh: text/x-shellscript; charset=utf-8
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]# iconv app.sh -f utf-8 -t UNICODE -o app.sh --verbose
app.sh:
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]#
[unicorn@unicomm auaa-audit]# file -i app.sh
app.sh: text/plain; charset=utf-16le                                 #修改编码格式成功
---[unicorn@unicomm auaa-audit]# ./app.sh startDev
-bash: ./app.sh: cannot execute binary file                          ###错误3:缺少可执行jar包
---
检查服务的启动参数等等
本次范爷检查出来的问题是:启动参数中定义的jdk的路径,找不到正确版本的jdk。
范爷把app.sh文件重新配置后,在185服务器商安装了jdk1.8后,配置了该服务器的JAVA_HOME环境变量等等。
[unicorn@unicomm jdk1.8.0_201]# pwd
/usr/local/jdk1.8.0_201
[unicorn@unicomm jdk1.8.0_201]# vi /etc/profile
---
修改profile文件内容如下:#set java environment
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$JAVA_HOME/bin:$PATH

谨以此自勉:还有什么是比什么也不做更困难的呢!

为什么只能sudo进mysql_解决项目中MySQL数据库执行删除语句时间太长的问题相关推荐

  1. mysql delete语句非常耗时_解决项目中MySQL数据库执行删除语句时间太长的问题

    问题描述: 由于业务需求,需要删除一些重复数据.即删除openid对应的2条数据,最终只保留一行. MySQL数据库,sql语句比较简单:删除数据前,备份数据是必须的! 先来错误的演示: 1.先把错误 ...

  2. mysql只能导入2m_如何解决phpMyAdmin导入mysql数据库超过2M的问题

    以前用phpMyAdmin导出的数据库文件超过2M而无法导入,由于网站停了的这段时间IDC又给我换了服务器,以前的数据都已经删了,没法再备份. 在网上搜索解决办法,有很多是修改php.ini配置文件, ...

  3. Python中Mysql数据库的sql语句参数传递问题

    在Python中, 通过pymysql库连接Mysql数据库的sql语句参数传递时需要注意: mysql的sql语句的字符串格式化不是标准的python的字符串格式化, 在python中无论字符串,数 ...

  4. mysql当执行delete语句时备份_mysql中,执行delete语句时出现Lock wait timeout exceeded问题...

    问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现 错误.但过了一会再 ...

  5. vscode+phpstudy连接使用mysql(解决phpstudy中mysql无法启动的问题)

    vscode+phpstudy连接使用mysql(解决phpstudy中mysql无法启动的问题) 使用vscode+phpstudy配置php开发环境网上很文章都是挺好的,都成功解决了我的问题.但是 ...

  6. mysql选什么隔离级别_互联网项目中mysql应该选什么事务隔离级别

    摘要 企业千万家,靠谱没几家. 社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?& ...

  7. 互联网项目中MySQL应该选什么事务隔离级别

    引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?"   你:"读未提交,读已提交,可重复读,串行化四个!默认是可重 ...

  8. XamarinSQLite教程在Xamarin.Android项目中提取数据库文件

    XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...

  9. XamarinSQLite教程在Xamarin.Android项目中定位数据库文件

    XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...

最新文章

  1. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现
  2. Vue SPA 打包优化实践
  3. 领域驱动设计,盒马技术团队这么做
  4. 音视频技术开发周刊 | 176
  5. 恼人的函数指针(一)
  6. ios 数组中的字典排序_利用数组和字典,实现按指定规则的排序
  7. Shell脚本中的并发(转)
  8. HttpWebRequest中GetResponse或者说GetRequestStream偶尔超时,或者是各种操作超时造成的假死的一些解决方案...
  9. 在CMakeLists.txt文件中包含Eigen
  10. oracle tbs_tmp,Oracle 12.2 设置LOCAL_TEMP_TABLESPACE
  11. easyexcel 工具类_阿里程序员常用的 15 款开发者工具~
  12. 【学习0605】NVIDIA DRIVE AGX Developer Kit - How to set up
  13. 虚拟机里Ubuntu编译内核方法
  14. 启程Objectvie-C(绿柠檬学习笔记)
  15. 5月1日起入境新加坡可使用IATA通行证,五一假期新加坡亲子游攻略
  16. 「写论文」“常用关联词”汇总
  17. ElasticSearch 高级查询语法
  18. 囧人又做了哪些囧事呢?
  19. (与运算)、|(或运算)、^(异或运算)的含义
  20. 数据结构——二叉搜索树

热门文章

  1. java面向对象super,final,static,匿名对象,内部类学习
  2. jenkins集成sonar
  3. 《分析服务从入门到精通读书笔记》第四章、创建父子维度(7)
  4. nslookup 使用说明
  5. cisco路由器故障判断及排除 计算机管理与维护
  6. 智能化改造!AI技术在传统企业大有可为!
  7. 自步对比学习: 充分挖掘无监督学习样本
  8. GitHub Trending第一之后,PaddleOCR再发大招:百度自研顶会SOTA算法正式开源!
  9. linux命令编写,Linux alias命令编写
  10. jsp为什么不加虚拟路径都能访问_JavaWeb学习笔记一(环境配置/jsp基本介绍)