网络编程
位置:首页>> 网络编程>> 数据库>> MySQL两种表存储结构性能比较测试过程(2)

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

 来源:编程中国 发布时间:2007-12-09 12:45:00 

标签:mysql,测试,性能

MyISAM,InnoDB性能比较


作者:空心菜(Invalid)

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) < 2: 
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)<1):
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,严重影响了速度。

算来也是个低级错误!

相关参考:

http://dev.mysql.com/doc/MySQL/en/COMMIT.html

http://dev.mysql.com/doc/MySQL/en/InnoDB_and_AUTOCOMMIT.html  

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com