`
hanyh
  • 浏览: 235440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

InnoDB delete from xxx速度暴慢原因

阅读更多
step1,一个简单的联系人表
CREATE TABLE `contact784` (
    `cid` bigint AUTO_INCREMENT NOT NULL,
    `uid` bigint NOT NULL,
    `email` varchar(128) NOT NULL,
    `name` varchar(64) NOT NULL,
    `mobile` varchar(16)  NULL,
    `atime` timestamp NULL,
    `type` enum('BLACK','WHITE','NORMAL') NOT NULl default 'NORMAL',
    `info` text NULL,
    `memo` varchar(1024)  NULL,
     PRIMARY key(`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT = 100;
ALTER TABLE `contact784` ADD UNIQUE INDEX uniq_uid_email(`uid`,`email`);


step2,插入了100W数据:
# -*- coding: utf-8 -*-  
#@author python.han@gmail.com

import MySQLdb
import random
import string
import threading
import time

domains = ['org','com.cn','qq.com','yahoo.com','163.com','com','cn','sina.cn','sina.com']
host = "localhost"
user = "xx"
pwd = "xx"
db = "t3"

def getRandomValue():
  email = ""
  s = ""
  for x in range(random.randint(1,10)):
    s += random.choice(string.letters)
  b = list(s)
  domain = ''.join(b)+"."+random.choice(domains)
  email = s+"@"+domain
  return email,s


def insert(count):
  conn=MySQLdb.connect(host=host,user=user,passwd=pwd,db=db) 
  cursor=conn.cursor()
  for cid in xrange(count):
    uid = random.randint(1000000000,9999999999)
    email,name = getRandomValue()
    sql = "insert into contact784(uid,email,name) values (%d,'%s', '%s')" %(uid,email,name)
    n=cursor.execute(sql) 
  cursor.close()
  conn.commit ()
  conn.close()


if __name__=='__main__':

  start = time.clock()
  for i in range(100):
    worker = threading.Thread(target = insert(10000))
    worker.start()
  end = time.clock()
  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

分享到:
评论
12 楼 zl_131 2009-08-10  
我记得innodb与MyISAM的区别就是这个,你的表有外键,删除肯定有效率问题,不过他在删除的时间好像是删除一条记录后就COMMIT一次,需要把表AUTO COMMIT设置一下,还有innodb在执行COUNT()命今时锁表,效率也很慢,建议使用MyISAM,就算有外键你可以通过关联进行查询,MyISAM查询速度很快,如果没有大批量的更新数据需要.
11 楼 mikeandmore 2009-08-08  
icefishc 写道
whaosoft 写道
drop table然后重建。  都比 delete from 快吗 有什么根据吗????


这个是真的.  drop 是DDL不需要事务日志。  这两个差的还是很多的, 试一下就知道了。

re
因为delete from 以后是可以rollback的。。。

不过我觉得insert into会更慢???
10 楼 kjj 2009-08-07  
hanyh 写道
If there are no FOREIGN KEY constraints, InnoDB performs fast truncation by dropping the original table and creating an empty one with the same definition,
  ------MySQL 5.0 Reference Manual

很遗憾,我的concat表是有外键约束。虽然另外一个外键约束的表是空的,到是可以考虑先去出外键约束后truncate....

删除前删除外间约束条件怎么样!!
9 楼 icefishc 2009-07-26  
whaosoft 写道
drop table然后重建。  都比 delete from 快吗 有什么根据吗????


这个是真的.  drop 是DDL不需要事务日志。  这两个差的还是很多的, 试一下就知道了。
8 楼 whaosoft 2009-07-26  
drop table然后重建。  都比 delete from 快吗 有什么根据吗????
7 楼 willko 2009-07-24  
那问题应该是在外键上了,,For an InnoDB table, InnoDB processes TRUNCATE TABLE by deleting rows one by one if there are any FOREIGN KEY constraints that reference the table.

刚开始,我还觉得和表空间有关系
6 楼 hanyh 2009-07-24  
If there are no FOREIGN KEY constraints, InnoDB performs fast truncation by dropping the original table and creating an empty one with the same definition,
  ------MySQL 5.0 Reference Manual

很遗憾,我的concat表是有外键约束。虽然另外一个外键约束的表是空的,到是可以考虑先去出外键约束后truncate....
5 楼 willko 2009-07-24  
mysql> TRUNCATE Member2;
Query OK, 0 rows affected (0.17 sec)

200w,innodb

配置很差的....
4 楼 icefishc 2009-07-23  
引用

If there are no FOREIGN KEY constraints, InnoDB performs fast truncation by dropping the original table and creating an empty one with the same definition,
  ------MySQL 5.0 Reference Manual


不过这个好像和版本有关系 似乎有人report过bug...
你用的啥版本
3 楼 heyjava 2009-07-23  
如果IO很大的话...根据InnoDB double Write原理,可以有以下优化:
1.innodb_log_file_size 可以设得大一点
2.innodb_log_buffer_size 也可以稍微大一点,减少BINLOG IO操作,当然这样安全性也会降低
3.innodb_flush_log_at_trx_commit =2 这个就不多说了..
4.innodb_buffer_pool_size 多余内存都设到这里去吧..

当然这跟Drop一个表再重建的速度无法比...
2 楼 hanyh 2009-07-23  
对InnoDB来说TRUNCATE TABLE CONTACTXX ;执行的动作类似,快不了多少 。
1 楼 icefishc 2009-07-23  
这个时候应该用 TRUNCATE

相关推荐

    MyISAM InnoDB 区别

     ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。  ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于...

    关于mysql innodb count(*)速度慢的解决办法

    针对InnoDB`COUNT(*)`查询速度慢的问题,有几种解决方案: 1. **利用索引和WHERE子句**: - 为表创建一个辅助索引,通常不选择主键索引,然后在`COUNT(*)`查询中添加适当的`WHERE`条件。例如,对于表`product`,...

    MySQL体系结构及原理(innodb)图文完美解析

    - `DELETE FROM table_name`命令的速度通常较慢,因为它需要逐条记录地删除数据,并可能涉及索引更新等操作。 - `ALTER TABLE`操作可能会更快,尤其是在执行简单的结构调整时,因为这种操作通常是基于元数据而非...

    mysql delete 多表连接删除功能

    - 对于InnoDB表,`DELETE`操作会触发事务,可以回滚以防止意外更改。 总的来说,`DELETE`语句在MySQL中提供了强大的数据清理功能,但使用时需谨慎,尤其是涉及到多表连接删除时,必须全面考虑其可能的影响。通过...

    InnoDB性能调节提示

    使用`DROP TABLE`或`CREATE TABLE AS SELECT`比`DELETE FROM`更快,尤其是在处理大量数据时。 以上是针对InnoDB性能调优的一些核心建议,实际应用中应根据系统具体情况进行调整。记得定期检查和监控系统状态,以...

    MySQL Innodb 索引原理详解

    ### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...

    MyISAM引擎与InnoDB引擎性能的对比

    MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...

    MySQL技术内幕 InnoDB存储引擎.pdf

    最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...

    innodb_ruby-master.zip

    《MySQL分析:深入理解InnoDB》 MySQL数据库系统在当今数据存储领域占据着重要的地位,尤其在InnoDB存储引擎的支持下,它提供了事务处理、行级锁定以及外键约束等功能,使得MySQL能够满足复杂的业务需求。InnoDB是...

    MySql Innodb 引擎特性详解

    ### MySQL Innodb 引擎特性详解 #### 一、MySQL Innodb 引擎概述 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它提供了多种存储引擎以满足不同场景的需求。其中,InnoDB是最常用的一种存储引擎之一,...

    关于InnoDB的索引大小

    在MySQL数据库系统中,InnoDB存储引擎是默认的引擎,它提供了事务处理、行级锁定以及外键支持,使得InnoDB在许多业务场景下成为首选。本篇文章将深入探讨InnoDB存储引擎中的索引大小问题,包括其影响因素、限制以及...

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    7. **自适应哈希索引(Adaptive Hash Index)**:InnoDB会根据查询模式自动创建哈希索引,提升热点数据的查询速度。 8. **空间索引(Spatial Index)**:InnoDB支持空间索引,可以处理地理空间数据,适用于GIS应用...

    InnoDB 中文参考手册

    InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 ...

    mysql innodb恢复数据工具.rar

    这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...

    InnoDB源码解析

    标题“MySQL的InnoDB引擎架构设计与分析”中涉及的知识点主要围绕MySQL数据库的InnoDB存储引擎,其中“架构设计与分析”指示我们对InnoDB的内部结构和工作机制进行深入的探讨。具体来说,以下为InnoDB存储引擎的核心...

    InnoDB: Hot Backup Manual

    ### InnoDB: 热备份手册 #### 一、ibbackup选项 InnoDB热备份工具(简称ibbackup)是一款能够实现在MySQL运行期间对InnoDB数据库进行无锁备份的强大工具,它不会干扰到正常的数据库处理流程。通过ibbackup,用户...

    XtraDB、InnoDB 内部结构示意图

    标题《XtraDB、InnoDB 内部结构示意图》表明文章将重点介绍MySQL数据库中XtraDB和InnoDB存储引擎的内部架构。由于内容描述中未给出更详细的信息,我们将基于提供的部分内容来推测文章的核心知识点。 从内容来看,...

    MySQL Innodb 参数详解与优化实践

    ### MySQL Innodb 参数详解与优化实践 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,其InnoDB存储引擎因其高可靠性和事务处理能力而备受青睐。为了充分发挥InnoDB的优势并针对特定场景进行性能...

Global site tag (gtag.js) - Google Analytics