热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » MySQL/MSSQL编程 » MySQL两种表存储结构性能比较测试过程

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

论坛链接
  • MySQL两种表存储结构性能比较测试过程
  • 发布时间:2007-12-06 15:56:26    浏览数:6406    发布者:tzlink    设置字体【   
MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条。后来换成MyISAM格式,一秒钟插入上万条。当时觉的这两个表的性能也差别太大了吧。后来自己推测,不应该差别这么慢,估计是写的插入语句有问题,决定做个测试:

测试环境:Redhat Linux9,4CPU,内存2G,MySQL版本为416-gamma-standard

测试程序:Python+Python-MySQL模块。

测试方案:

1、MyISAM格式分别测试,事务和不用事务两种情况:


2、InnoDB格式分别测试Automit=1(不用begin transaction和用begin transaction模式),Automit=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关闭Automit,不用事务:

以下为引用的内容:

CREATE TABLE `INNODB_NA_NB` (

`TableId` int(11) NOT NULL default '0',



`TableString` varchar(21) NOT NULL default ''


) ENGINE=InnoDB;

4、InnoDB关闭Automit,用事务:

以下为引用的内容:

CREATE TABLE `INNODB_NA_BE` (

`TableId` int(11) NOT NULL default '0',

`TableString` varchar(21) NOT NULL default ''

) ENGINE=InnoDB;


5、InnoDB开启Automit,不用事务


以下为引用的内容:

CREATE TABLE `INNODB_AU_NB` (

`TableId` int(11) NOT NULL default '0',

`TableString` varchar(21) NOT NULL default ''


) ENGINE=InnoDB;


6、InnoDB开启Automit,用事务:

以下为引用的内容:

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;"

cexecute("BEGIN;")

return

def mit():

print "ExecSQL:MIT;"

cexecute("MIT;")

return

def Automit(flag):

print "ExecSQL:Set AUTOMIT = "+str(flag)

cexecute("Set AUTOMIT = "+str(flag))

return

def getcount(table):

#print "ExecSQL:select count(*) from "+table

cexecute("select count(*) from "+table)

return cfetchall()[0][0]

def AddTable (Table,TableId,TableString):

sql = "INSERT INTO "+Table+"(TableId, TableString) VALUES( "+ TableId+ ",'" + TableString +"')"


try:

cexecute(sql)

except MySQLdbOperationalError,error:

print "AddTable Error:",error

return -1;

return crowcount

def main():

argv = sysargv

if len(argv) < 2:

print 'Usage:',argv[0],' TableId TestCount \n'

sysexit(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 = MySQLdbconnect(db_host, db_user, db_user_passwd, db_name)

except MySQLDbOperationalError,error:

print "Connect MySQL[%s %s/%s %s] DB Error:"%(db_host,db_user,db_user_passwd,db_name),error,"\n"


sysexit(1)

else:

c = mdbcursor()

table,automit,trans = test

starttime = timetime()

print table," ",timestrftime("%y-%m-%d %H:%M:%S",timelocaltime())

if automit != None: _

Automit(automit)

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:
mit()

print timestrftime("%y-%m-%d %H:%M:%S",timelocaltime())

endtime = timetime()

usedtime = endtime-starttime

print table,"count:",getcount(table)," used time:",usedtime

cclose()

mdbclose()

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: 21132440567


MyISAM_TS 04-10-22 16:33:26

ExecSQL:BEGIN;

ExecSQL:MIT;

04-10-22 16:33:29

MyISAM_TS count: 10000 used time: 265475201607


INNODB_NA_NB 04-10-22 16:33:29

ExecSQL:Set AUTOMIT = 0


04-10-22 16:33:31


INNODB_NA_NB count: 10000 used time: 251947999001


INNODB_NA_BE 04-10-22 16:33:31

ExecSQL:Set AUTOMIT = 0


ExecSQL:BEGIN;

ExecSQL:MIT;


04-10-22 16:33:35

INNODB_NA_BE count: 10000 used time: 385625100136


INNODB_AU_NB 04-10-22 16:33:35


ExecSQL:Set AUTOMIT = 1


04-10-22 16:34:19

INNODB_AU_NB count: 10000 used time: 437153041363


INNODB_AU_BE 04-10-22 16:34:19

ExecSQL:Set AUTOMIT = 1

ExecSQL:BEGIN;

ExecSQL:MIT;

04-10-22 16:34:22

INNODB_AU_BE count: 10000 used time: 314328193665


结论:

由此得知影响速度的主要原因是AUTOMIT默认设置是打开的,

我当时的程序没有显式调用BEGIN;开始事务,导致每插入一条都自动mit,严重影响了速度。

算来也是个低级错误!

相关参考:

http://devmysql/doc/MySQL/en/MIThtml

http://devmysql/doc/MySQL/en/InnoDB_and_AUTOMIThtml
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理