Heim Datenbank MySQL-Tutorial 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,严重影响了速度。
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Nehmen Sie an einem neuen Xianxia-Abenteuer teil! Der Vorab-Download von „Zhu Xian 2' „Wuwei Test' ist jetzt verfügbar Nehmen Sie an einem neuen Xianxia-Abenteuer teil! Der Vorab-Download von „Zhu Xian 2' „Wuwei Test' ist jetzt verfügbar Apr 22, 2024 pm 12:50 PM

Der „Inaction Test“ des neuen Fantasy-Märchen-MMORPG „Zhu Xian 2“ startet am 23. April. Was für eine neue Märchen-Abenteuergeschichte wird auf dem Kontinent Zhu Die Six Realm Immortal World, eine Vollzeitakademie zur Kultivierung von Unsterblichen, ein freies Leben zur Kultivierung von Unsterblichen und jede Menge Spaß in der Welt der Unsterblichen warten darauf, von den unsterblichen Freunden persönlich erkundet zu werden! Der Vorab-Download von „Wuwei Test“ ist jetzt möglich. Sie können sich zum Herunterladen auf die offizielle Website begeben. Der Aktivierungscode kann nach dem Vorab-Download und der Installation verwendet werden abgeschlossen. „Zhu Als Blaupause wird der Spielhintergrund festgelegt

PHP-Array-Schlüsselwertumdrehen: Vergleichende Leistungsanalyse verschiedener Methoden PHP-Array-Schlüsselwertumdrehen: Vergleichende Leistungsanalyse verschiedener Methoden May 03, 2024 pm 09:03 PM

Der Leistungsvergleich der PHP-Methoden zum Umdrehen von Array-Schlüsselwerten zeigt, dass die Funktion array_flip() in großen Arrays (mehr als 1 Million Elemente) eine bessere Leistung als die for-Schleife erbringt und weniger Zeit benötigt. Die for-Schleifenmethode zum manuellen Umdrehen von Schlüsselwerten dauert relativ lange.

Leistungsvergleich verschiedener Java-Frameworks Leistungsvergleich verschiedener Java-Frameworks Jun 05, 2024 pm 07:14 PM

Leistungsvergleich verschiedener Java-Frameworks: REST-API-Anforderungsverarbeitung: Vert.x ist am besten, mit einer Anforderungsrate von 2-mal SpringBoot und 3-mal Dropwizard. Datenbankabfrage: HibernateORM von SpringBoot ist besser als ORM von Vert.x und Dropwizard. Caching-Vorgänge: Der Hazelcast-Client von Vert.x ist den Caching-Mechanismen von SpringBoot und Dropwizard überlegen. Geeignetes Framework: Wählen Sie entsprechend den Anwendungsanforderungen. Vert.x eignet sich für leistungsstarke Webdienste, SpringBoot eignet sich für datenintensive Anwendungen und Dropwizard eignet sich für Microservice-Architekturen.

Wie kann die Leistung von Multithread-Programmen in C++ optimiert werden? Wie kann die Leistung von Multithread-Programmen in C++ optimiert werden? Jun 05, 2024 pm 02:04 PM

Zu den wirksamen Techniken zur Optimierung der C++-Multithread-Leistung gehört die Begrenzung der Anzahl der Threads, um Ressourcenkonflikte zu vermeiden. Verwenden Sie leichte Mutex-Sperren, um Konflikte zu reduzieren. Optimieren Sie den Umfang der Sperre und minimieren Sie die Wartezeit. Verwenden Sie sperrenfreie Datenstrukturen, um die Parallelität zu verbessern. Vermeiden Sie geschäftiges Warten und benachrichtigen Sie Threads über Ereignisse über die Ressourcenverfügbarkeit.

Was sind die Syntax- und Strukturmerkmale von Lambda-Ausdrücken? Was sind die Syntax- und Strukturmerkmale von Lambda-Ausdrücken? Apr 25, 2024 pm 01:12 PM

Der Lambda-Ausdruck ist eine anonyme Funktion ohne Namen und seine Syntax lautet: (parameter_list)->Ausdruck. Sie zeichnen sich durch Anonymität, Vielfalt, Currying und Schließung aus. In praktischen Anwendungen können Lambda-Ausdrücke verwendet werden, um Funktionen prägnant zu definieren, beispielsweise die Summationsfunktion sum_lambda=lambdax,y:x+y, und die Funktion map() auf die Liste anzuwenden, um die Summationsoperation durchzuführen.

Die Rolle des Golang-Funktionsschlusses beim Testen Die Rolle des Golang-Funktionsschlusses beim Testen Apr 24, 2024 am 08:54 AM

Funktionsabschlüsse der Go-Sprache spielen beim Unit-Testen eine wichtige Rolle: Werte erfassen: Abschlüsse können auf Variablen im äußeren Bereich zugreifen, sodass Testparameter erfasst und in verschachtelten Funktionen wiederverwendet werden können. Vereinfachen Sie den Testcode: Durch die Erfassung von Werten vereinfachen Abschlüsse den Testcode, indem sie die Notwendigkeit beseitigen, Parameter für jede Schleife wiederholt festzulegen. Verbessern Sie die Lesbarkeit: Verwenden Sie Abschlüsse, um die Testlogik zu organisieren und so den Testcode klarer und leichter lesbar zu machen.

Was sind die Unterschiede zwischen Funktionstests und Abdeckung in verschiedenen Sprachen? Was sind die Unterschiede zwischen Funktionstests und Abdeckung in verschiedenen Sprachen? Apr 27, 2024 am 11:30 AM

Funktionstests überprüfen die Funktionsfunktionalität durch Black-Box- und White-Box-Tests, während die Codeabdeckung den Teil des Codes misst, der von Testfällen abgedeckt wird. Verschiedene Sprachen (wie Python und Java) verfügen über unterschiedliche Test-Frameworks, Abdeckungstools und Funktionen. Praktische Fälle zeigen, wie man Unittest und Coverage von Python sowie JUnit und JaCoCo von Java für Funktionstests und Coverage-Bewertung verwendet.

Welche Auswirkungen hat die Konvertierung von PHP-Arrays in Objekte auf die Leistung? Welche Auswirkungen hat die Konvertierung von PHP-Arrays in Objekte auf die Leistung? Apr 30, 2024 am 08:39 AM

In PHP wirkt sich die Konvertierung von Arrays in Objekte auf die Leistung aus, die hauptsächlich von Faktoren wie Array-Größe, Komplexität, Objektklasse usw. beeinflusst wird. Um die Leistung zu optimieren, sollten Sie benutzerdefinierte Iteratoren verwenden und unnötige Konvertierungen, Batch-Konvertierung von Arrays und andere Techniken vermeiden.

See all articles