首页 数据库 mysql教程 MySQL两种表存储结构性能比较测试过程_MySQL

MySQL两种表存储结构性能比较测试过程_MySQL

Jun 01, 2016 pm 02:11 PM
innodb 存储 性能 比较 测试 结构 过程


  MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条。后来换成MyISAM格式,一秒钟插入上万条。当时觉的这两个表的性能也差别太大了吧。后来自己推测,不应该差别这么慢,估计是写的插入语句有问题,决定做个测试:
  
  测试环境:Redhat Linux9,4CPU,内存2G,MySQL版本为4.1.6-gamma-standard
  
  测试程序:Python+Python-MySQL模块。
  
  测试方案:
  
  1、MyISAM格式分别测试,事务和不用事务两种情况:
  
  2、InnoDB格式分别测试AutoCommit=1(不用begin transaction和用begin transaction模式),
  
  AutoCommit=0 (不用begin transaction和用begin transaction模式)四种情况。
  
  测试方法为插入10000条记录。为了测试不互相影响,单独建立了专用的测试表,建表语句如下:
  
  1、MyISAM不用事务表:
  
  CREATE TABLE `MyISAM_NT` (
  
  `TableId` int(11) NOT NULL default '0',
  
  `TableString` varchar(21) NOT NULL default ''
  
  ) ENGINE=MyISAM;
  
  2、MyISAM用事务表:
  
  CREATE TABLE `MyISAM_TS` (
  
  `TableId` int(11) NOT NULL default '0',
  
  `TableString` varchar(21) NOT NULL default ''
  
  ) ENGINE=MyISAM;
  
  3、InnoDB关闭AutoCommit,不用事务:
  
  CREATE TABLE `INNODB_NA_NB` (
  
  `TableId` int(11) NOT NULL default '0',
  
  `TableString` varchar(21) NOT NULL default ''
  
  ) ENGINE=InnoDB;
  
  4、InnoDB关闭AutoCommit,用事务:
  
  CREATE TABLE `INNODB_NA_BE` (
  
  `TableId` int(11) NOT NULL default '0',
  
  `TableString` varchar(21) NOT NULL default ''
  
  ) ENGINE=InnoDB;
  
  5、InnoDB开启AutoCommit,不用事务:
  
  CREATE TABLE `INNODB_AU_NB` (
  
  `TableId` int(11) NOT NULL default '0',
  
  `TableString` varchar(21) NOT NULL default ''
  
  ) ENGINE=InnoDB;
  
  6、InnoDB开启AutoCommit,用事务:
  
  CREATE TABLE `INNODB_AU_BE` (
  
  `TableId` int(11) NOT NULL default '0',
  
  `TableString` varchar(21) NOT NULL default ''
  
  ) ENGINE=InnoDB;
  
  测试的Python脚本如下:
  
  #!/usr/bin/env Python
  
  '''
  
  MyISAM,InnoDB性能比较
  
  作者:空心菜(Invalid)
  
  时间:2004-10-22
  
  '''
  
  import MySQLdb
  
  import sys
  
  import os
  
  import string
  
  import time
  
  c = None
  
  testtables = [("MyISAM_NT",None,0),
  
  ("MyISAM_TS",None,1),
  
  ("INNODB_NA_NB",0,0),
  
  ("INNODB_NA_BE",0,1),
  
  ("INNODB_AU_NB",1,0),
  
  ("INNODB_AU_BE",1,1)
  
  ]
  
  def BeginTrans():
  
  print "ExecSQL:BEGIN;"
  
  c.execute("BEGIN;")
  
  return
  
  def Commit():
  
  print "ExecSQL:COMMIT;"
  
  c.execute("COMMIT;")
  
  return
  
  def AutoCommit(flag):
  
  print "ExecSQL:Set AUTOCOMMIT = "+str(flag)
  
  c.execute("Set AUTOCOMMIT = "+str(flag))
  
  return
  
  def getcount(table):
  
  #print "ExecSQL:select count(*) from "+table
  
  c.execute("select count(*) from "+table)
  
  return c.fetchall()[0][0]
  
  def AddTable (Table,TableId,TableString):
  
  sql = "INSERT INTO "+Table+"(TableId, TableString) VALUES( "+ TableId+ ",'" + TableString +"')"
  
  try:
  
  c.execute(sql)
  
  except MySQLdb.OperationalError,error:
  
  print "AddTable Error:",error
  
  return -1;
  
  return c.rowcount
  
  def main():
  
  argv = sys.argv
  
  if len(argv)   
  print 'Usage:',argv[0],' TableId TestCount \n'
  
  sys.exit(1)
  
  global c #mysql访问cursor
  
  db_host = "localhost"
  
  db_name = "demo"
  
  db_user = "root"
  
  db_user_passwd = ""
  
  print "Config:[%s %s/%s %s] DB\n"%(db_host,db_user,db_user_passwd,db_name)
  
  if len(argv) > 2:
  
  tableid = argv[1]
  
  testcount = int(argv[2]) #
  
  for test in testtables:
  
  #每次操作前都重写建立数据库连接
  
  try:
  
  mdb = MySQLdb.connect(db_host, db_user, db_user_passwd, db_name)
  
  except MySQLDb.OperationalError,error:
  
  print "Connect Mysql[%s %s/%s %s] DB Error:"%(db_host,db_user,db_user_passwd,db_name),error,"\n"
  
  sys.exit(1)
  
  else:
  
  c = mdb.cursor()
  
  table,autocommit,trans = test
  
  starttime = time.time()
  
  print table," ",time.strftime("%y-%m-%d %H:%M:%S",time.localtime())
  
  if autocommit != None:
  
  AutoCommit(autocommit)
  
  if trans == 1:
  
  BeginTrans()
  
  for i in xrange(testcount):
  
  tablestring = "%020d"%i
  
  if (AddTable(table,tableid,tablestring)  
  print "AddTable Error",tablestring
  
  if trans == 1:
  
  Commit()
  
  print time.strftime("%y-%m-%d %H:%M:%S",time.localtime())
  
  endtime = time.time()
  
  usedtime = endtime-starttime
  
  print table,"count:",getcount(table)," used time:",usedtime
  
  c.close()
  
  mdb.close()
  
  if __name__ == '__main__':
  
  main()
  
  测试结果如下:
  
  Config:[localhost root/ demo] DB
  
  MyISAM_NT 04-10-22 16:33:24
  
  04-10-22 16:33:26
  
  MyISAM_NT count: 10000 used time: 2.1132440567
  
  MyISAM_TS 04-10-22 16:33:26
  
  ExecSQL:BEGIN;
  
  ExecSQL:COMMIT;
  
  04-10-22 16:33:29
  
  MyISAM_TS count: 10000 used time: 2.65475201607
  
  INNODB_NA_NB 04-10-22 16:33:29
  
  ExecSQL:Set AUTOCOMMIT = 0
  
  04-10-22 16:33:31
  
  INNODB_NA_NB count: 10000 used time: 2.51947999001
  
  INNODB_NA_BE 04-10-22 16:33:31
  
  ExecSQL:Set AUTOCOMMIT = 0
  
  ExecSQL:BEGIN;
  
  ExecSQL:COMMIT;
  
  04-10-22 16:33:35
  
  INNODB_NA_BE count: 10000 used time: 3.85625100136
  
  INNODB_AU_NB 04-10-22 16:33:35
  
  ExecSQL:Set AUTOCOMMIT = 1
  
  04-10-22 16:34:19
  
  INNODB_AU_NB count: 10000 used time: 43.7153041363
  
  INNODB_AU_BE 04-10-22 16:34:19
  
  ExecSQL:Set AUTOCOMMIT = 1
  
  ExecSQL:BEGIN;
  
  ExecSQL:COMMIT;
  
  04-10-22 16:34:22
  
  INNODB_AU_BE count: 10000 used time: 3.14328193665
  
  结论:
  
  由此得知影响速度的主要原因是AUTOCOMMIT默认设置是打开的,我当时的程序没有显式调用BEGIN;开始事务,导致每插入一条都自动Commit,严重影响了速度。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

加入全新仙侠冒险!《诛仙2》'无为测试”预下载开启 加入全新仙侠冒险!《诛仙2》'无为测试”预下载开启 Apr 22, 2024 pm 12:50 PM

新派幻想仙侠MMORPG《诛仙2》“无为测试”即将于4月23日开启,在原著千年后的诛仙大陆,会发生怎样的全新仙侠冒险故事?六境仙侠大世界,全日制修仙学府,自由自在的修仙生活,仙界中的万般妙趣都在等待着仙友们亲自前往探索!“无为测试”预下载现已开启,仙友们可前往官网下载,开服前无法登录游戏服务器,激活码可在预下载安装完成后使用。《诛仙2》“无为测试”开放时间:4月23日10:00——5月6日23:59诛仙正统续作全新仙侠冒险篇章《诛仙2》以《诛仙》小说为蓝图,在继承原著世界观的基础上,将游戏背景设

不同Java框架的性能对比 不同Java框架的性能对比 Jun 05, 2024 pm 07:14 PM

不同Java框架的性能对比:RESTAPI请求处理:Vert.x最佳,请求速率达SpringBoot2倍,Dropwizard3倍。数据库查询:SpringBoot的HibernateORM优于Vert.x及Dropwizard的ORM。缓存操作:Vert.x的Hazelcast客户机优于SpringBoot及Dropwizard的缓存机制。合适框架:根据应用需求选择,Vert.x适用于高性能Web服务,SpringBoot适用于数据密集型应用,Dropwizard适用于微服务架构。

PHP 数组键值翻转:不同方法的性能对比分析 PHP 数组键值翻转:不同方法的性能对比分析 May 03, 2024 pm 09:03 PM

PHP数组键值翻转方法性能对比表明:array_flip()函数在大型数组(超过100万个元素)下比for循环性能更优,耗时更短。手动翻转键值的for循环方法耗时相对较长。

C++中如何优化多线程程序的性能? C++中如何优化多线程程序的性能? Jun 05, 2024 pm 02:04 PM

优化C++多线程性能的有效技术包括:限制线程数量,避免争用资源。使用轻量级互斥锁,减少争用。优化锁的范围,最小化等待时间。采用无锁数据结构,提高并发性。避免忙等,通过事件通知线程资源可用性。

lambda 表达式的语法和结构有什么特点? lambda 表达式的语法和结构有什么特点? Apr 25, 2024 pm 01:12 PM

Lambda表达式是无名称的匿名函数,其语法为:(parameter_list)->expression。它们具有匿名性、多样性、柯里化和闭包等特点。实际应用中,Lambda表达式可用于简洁地定义函数,如求和函数sum_lambda=lambdax,y:x+y,并通过map()函数应用于列表来进行求和操作。

golang函数闭包在测试中的作用 golang函数闭包在测试中的作用 Apr 24, 2024 am 08:54 AM

Go语言函数闭包在单元测试中发挥着至关重要的作用:捕获值:闭包可以访问外部作用域的变量,允许在嵌套函数中捕获和重用测试参数。简化测试代码:通过捕获值,闭包消除了对每个循环重复设置参数的需求,从而简化了测试代码。提高可读性:使用闭包可以组织测试逻辑,使测试代码更清晰、更易于阅读。

不同语言的函数测试与覆盖率有什么区别? 不同语言的函数测试与覆盖率有什么区别? Apr 27, 2024 am 11:30 AM

函数测试通过黑盒和白盒测试验证函数功能,而代码覆盖率衡量了测试用例覆盖的代码部分。不同语言(如Python和Java)的测试框架、覆盖率工具和特性不同。实战案例展示了如何使用Python的Unittest和Coverage以及Java的JUnit和JaCoCo进行函数测试和覆盖率评估。

PHP 数组转对象对性能的影响是什么? PHP 数组转对象对性能的影响是什么? Apr 30, 2024 am 08:39 AM

在PHP中,数组到对象的转换会对性能产生影响,主要受数组大小、复杂性、对象类等因素影响。为了优化性能,可以考虑使用自定义迭代器、避免不必要的转换、批量转换数组等技巧。

See all articles