step1,一个简单的联系人表

  1. CREATE TABLE `contact784` (
  2. `cid` bigint AUTO_INCREMENT NOT NULL,
  3. `uid` bigint NOT NULL,
  4. `email` varchar(128) NOT NULL,
  5. `name` varchar(64) NOT NULL,
  6. `mobile` varchar(16)  NULL,
  7. `atime` timestamp NULL,
  8. `type` enum('BLACK','WHITE','NORMAL') NOT NULl default 'NORMAL',
  9. `info` text NULL,
  10. `memo` varchar(1024)  NULL,
  11. PRIMARY key(`cid`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT = 100;
  13. ALTER TABLE `contact784` ADD UNIQUE INDEX uniq_uid_email(`uid`,`email`);

step2,插入了100W数据:

  1. # -*- coding: utf-8 -*-
  2. #@author python.han@gmail.com
  3. import MySQLdb
  4. import random
  5. import string
  6. import threading
  7. import time
  8. domains = ['org','com.cn','qq.com','yahoo.com','163.com','com','cn','sina.cn','sina.com']
  9. host = "localhost"
  10. user = "xx"
  11. pwd = "xx"
  12. db = "t3"
  13. def getRandomValue():
  14. email = ""
  15. s = ""
  16. for x in range(random.randint(1,10)):
  17. s += random.choice(string.letters)
  18. b = list(s)
  19. domain = ''.join(b)+"."+random.choice(domains)
  20. email = s+"@"+domain
  21. return email,s
  22. def insert(count):
  23. conn=MySQLdb.connect(host=host,user=user,passwd=pwd,db=db)
  24. cursor=conn.cursor()
  25. for cid in xrange(count):
  26. uid = random.randint(1000000000,9999999999)
  27. email,name = getRandomValue()
  28. sql = "insert into contact784(uid,email,name) values (%d,'%s', '%s')" %(uid,email,name)
  29. n=cursor.execute(sql)
  30. cursor.close()
  31. conn.commit ()
  32. conn.close()
  33. if __name__=='__main__':
  34. start = time.clock()
  35. for i in range(100):
  36. worker = threading.Thread(target = insert(10000))
  37. worker.start()
  38. end = time.clock()
  39. print "elsaped:%s" %(end-start)

step3,要重新单线程插入,需要把数据清空. 
因为python多线程由于GIL的关系,实际上上面的100个线程只产生了一个连接,需要测试一下纯单线程插入是不是要快些:)

执行:delete from contact784 
半小时没有执行完毕!

诊断方式: 
1,iostat ,top等查看磁盘io很大 
2,inotifywatch发现io的事件非常多

原因:在大表上使用delete from 清空一个表是非常慢的。因为InnoDB必须处理表中的每一行,根据InnoDB的事务设计原则,首先需要把“删除动作”写入“事务日志”,然后写入实际的表。所以,清空大表的时候,最好直接drop table然后重建。 
注: 
在delete from 执行的过程中: 
用:select count(*) from contact784;发现表的数据量一直是100行 
用:explain select count(*) from contact784;可以发现数量一直在减少,显示当前

784是是因为前面这个文章的原因“ 
http://hanyh.iteye.com/blog/431323 

 
 
 
 
我从oracle undo的角度来回答哈:
delete是个极其昂贵的操作哦,它会产生大量的undo数据(最多的),你每删一次oracle都要记录一次。
如果从undo角度来看的话,可以优化的就是控制事务的长度,即用:commit。
 
 
 
 

一次delete速度异常慢的处理过程

转自:http://space.itpub.net/10710960/viewspace-610982

一次小数据量删除,但花费2个小时还没完成的问题

delete from TOPBOX_COURSEWARE where id like '760%';
花费非常长的时间,topbox_courseware表大概2w数据,要删除的也就2500条数据。
问题原因:
由于TOPBOX_COURSEWARE表与多个表有外键关联,而且关联的表中有2张千万级别的大表。
通过v$session_wait,v$session表

select * from v$session_wait a,v$session b
where b.sid=a.sid
and a.event not like 'SQL*Net%';

发现该session的event是db file scattered read。
这个事件一般是表示法伤了全表扫描相关的等待。通常意味着全表扫描过多,或者I/O能力不足,或是I/O争用造成的。

解决方法:
1.通过dba_constraints表找到topbox_courseware表对应的约束
select * from dba_constraints where constraint_type='R' and wner='TOPBOX' and r_constraint_name='PK_TOPBOX_COURSEWARE'
得到两个外键约束名
FK_TOPBOX_COURSCO_REF_COUR
FK_TOPBOX_CSTUDY_REF_COUSE

2.通过命令将这2个约束disable
alter table topbox_coursescore disable constraint fk_topbox_coursco_ref_cour;
alter table topbox_coursestudy disable constraint fk_topbox_cstudy_ref_couse;

通过上面的处理delete只需要不到1秒的时间

3.将约束重新激活
由于topbox_coursescore,topbox_coursestudy是千万级的大表,如果直接enable而不加其他参数,启用约束后,oracle会对表中数据
逐条检查,所以速度会非常慢。而且已经插入的数据没有脏数据,所以为了避免不必要的工作,就要使用novalidate
alter table topbox_coursescore enable novalidate constraint fk_topbox_coursco_ref_cour;
alter table topbox_coursestudy enable novalidate constraint fk_topbox_cstudy_ref_couse;

一次delete速度异常慢的处理过程的更多相关文章

  1. .netcore项目部署到linux的docker里后,速度异常的慢

    .netcore项目部署到linux的docker里后,速度异常的慢,部署在iis下速度非常快. 特别是 接口里再调用其他接口,那速度绝对是蜗牛爬行的速度. 经过几个月的折腾,终于知道是什么问题了: ...

  2. C#发送邮件异常:根据验证过程,远程证书无效

    今天在做发送邮件功能时,开始用qq邮箱和163邮箱都可以正常发送,后再改用我公司的邮箱和smtp时竟然报错了. 异常提示-----"根据验证过程,远程证书无效",后来通过查询资料解 ...

  3. Linux 2.6.16 TCP连接速度异常的问题分析

    版权声明:本文由余子军原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/104 来源:腾云阁 https://www.qclo ...

  4. VS启动调试速度异常的缓慢问题

    方法1: 1. 进入vs2017 2.工具 --选项 -- IntelliTrace 关闭此功能 方法2: 1.由于缓存数据太多,需要重置下vs的开发环境 2.打开visual studio 的命名窗 ...

  5. wordpress后台加载速度异常缓慢排查记录(原创)

    原因在于在function.php函数中加入了下面的代码导致了缓慢: //停用版本更新通知remove_action('load-update-core.php', 'wp_update_themes ...

  6. C#发送邮件异常:根据验证过程,远程证书无效,何解???

    /// <summary> /// 发送邮件 /// </summary> /// <param name="mailSubjct">邮件主题& ...

  7. EXCEPTION_HIJACK(0xe0434f4e)异常的抛出过程

    样例工程 在VS2013里新建一个C#控制台工程,写下如下代码: using System; using System.Collections.Generic; using System.Linq; ...

  8. 对MySQL DELETE语法的详细解析

    以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...

  9. ###《More Effective C++》- 异常

    More Effective C++ #@author: gr #@date: 2015-05-24 #@email: forgerui@gmail.com 九.利用destructors避免泄漏资源 ...

随机推荐

  1. go接口及嵌入类型例子

    书上看的.慢慢领会.. package main import ( "fmt" ) type notifier interface { notify() } type user s ...

  2. AndroidStudio升到最新版本(3.1.2)之后

    暂时发现的需要大家注意的地方 1.androidstudio3无法导入moudle? 例如:我写了一个简单的项目,需要导入一个第三方的moudle,我导入: 因为AS升级之后,没有突出颜色的变化(变黑 ...

  3. [loj6038]「雅礼集训 2017 Day5」远行 lct+并查集

    给你 n 个点,支持 m 次操作,每次为以下两种:连一条边,保证连完后是一棵树/森林:询问一个点能到达的最远的点与该点的距离.强制在线. n≤3×10^5 n≤3×10^5 ,m≤5×10^5 m≤5 ...

  4. jenkins pipelines 简介

    1. 简介:A pipeline就是软件和质量保证进程中的一部分中的自动化连续操作.它可以看成是一连串的脚本. 操作组:就是把一系统的操作可以合成一个个的步骤,如果一个步骤失败,那么后续步骤便不会执行 ...

  5. ArrayList or LinkedList

    ArrayList or LinkedList import java.util.*; public class TestArrayLinked { public static void main(S ...

  6. jquery.autocomplete修改 实现键盘上下键 自动填充

    根据需求要实现通过键盘上下移动,获得联想菜单中的值,如同google baidu的查询功能. 在网上找了很久没有找到可以实现该功能的插件,无奈只能自己动手改代码.找到js中的KEY.DOWN 和 KE ...

  7. Django学习笔记-2018.11.17

    URL配置: 项目下的urls.py配置的为URL总路径,在使用第二种方法在app下配置的urls.py是在总路径下的分路径 Templates: DTL初步使用 render()函数支持dict类型 ...

  8. 简单模仿拉钩网上的“hot_info”

    目录 前言 技术 判断进入div的方向 动画 绑定事件 css html 还需改进的地方 前言 突然想起来之前看到拉钩网上的hot_info(不知道该叫什么,但是拉钩网上这个div的class是hot ...

  9. Wireshark数据抓包教程之Wireshark捕获数据

    Wireshark数据抓包教程之Wireshark捕获数据 Wireshark抓包方法 在使用Wireshark捕获以太网数据,可以捕获分析到自己的数据包,也可以去捕获同一局域网内,在知道对方IP地址 ...

  10. nyoj 737 石子合并 http://blog.csdn.net/wangdan11111/article/details/45032519

    http://blog.csdn.net/wangdan11111/article/details/45032519 http://acm.nyist.net/JudgeOnline/problem. ...