MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入几条。后来换成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模式)四种情况。测试方法为插入条记录。为了测试不互相影响,单独建立了专用的测试表,建表语句如下:1、MyISAM不用事务表:CREATE TABLE `MyISAM_NT` (  `TableId` int() NOT NULL default '0',  `TableString` varchar() NOT NULL default '') ENGINE=MyISAM;2、MyISAM用事务表:CREATE TABLE `MyISAM_TS` (  `TableId` int() NOT NULL default '0',  `TableString` varchar() NOT NULL default '') ENGINE=MyISAM;3、InnoDB关闭AutoCommit,不用事务:CREATE TABLE `INNODB_NA_NB` (  `TableId` int() NOT NULL default '0',  `TableString` varchar() NOT NULL default '') ENGINE=InnoDB;4、InnoDB关闭AutoCommit,用事务:CREATE TABLE `INNODB_NA_BE` (  `TableId` int() NOT NULL default '0',  `TableString` varchar() NOT NULL default '') ENGINE=InnoDB;5、InnoDB开启AutoCommit,不用事务:CREATE TABLE `INNODB_AU_NB` (  `TableId` int() NOT NULL default '0',  `TableString` varchar() NOT NULL default '') ENGINE=InnoDB;6、InnoDB开启AutoCommit,用事务:CREATE TABLE `INNODB_AU_BE` (  `TableId` int() NOT NULL default '0',  `TableString` varchar() NOT NULL default '') ENGINE=InnoDB;测试的Python脚本如下:#!/usr/bin/env Python'''MyISAM,InnoDB性能比较作者:空心菜(Invalid)时间:--'''import MySQLdb import sysimport osimport stringimport timec = Nonetesttables = [("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;")    returndef Commit():    print "ExecSQL:COMMIT;"    c.execute("COMMIT;")    returndef AutoCommit(flag):    print "ExecSQL:Set AUTOCOMMIT = "+str(flag)    c.execute("Set AUTOCOMMIT = "+str(flag))    returndef 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.rowcountdef 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] DBn"%(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 = "%d"%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] DBMyISAM_NT   -- ::-- ::MyISAM_NT count:   used time: 2.MyISAM_TS   -- ::ExecSQL:BEGIN;ExecSQL:COMMIT;-- ::MyISAM_TS count:   used time: 2.INNODB_NA_NB   -- ::ExecSQL:Set AUTOCOMMIT = -- ::INNODB_NA_NB count:   used time: 2.INNODB_NA_BE   -- ::ExecSQL:Set AUTOCOMMIT = 0ExecSQL:BEGIN;ExecSQL:COMMIT;-- ::INNODB_NA_BE count:   used time: 3.INNODB_AU_NB   -- ::ExecSQL:Set AUTOCOMMIT = -- ::INNODB_AU_NB count:   used time: .INNODB_AU_BE   -- ::ExecSQL:Set AUTOCOMMIT = 1ExecSQL:BEGIN;ExecSQL:COMMIT;-- ::INNODB_AU_BE count:   used time: 3.结论:由此得知影响速度的主要原因是AUTOCOMMIT默认设置是打开的,我当时的程序没有显式调用BEGIN;开始事务,导致每插入一条都自动Commit,严重影响了速度。算来也是个低级错误!相关参考:                                    
推荐整理分享MySQL两种表存储结构MyISAM和InnoDB的性能比较测试(mysql两张表差异数据),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql两张表连接,mysql两张表差异数据,mysql两个表,mysql两个表连接,mysql中两张表如何建立连接,mysql from两个表,mysql两张表差异数据,mysql两个表,内容如对您有帮助,希望把文章链接给更多的朋友!
                        GROUP_CONCAT的用法                        GROUP_CONCAT今天工作需要,要用到groupby等等,查看手册,没想到发现了GROUP_CONCAT这个好东西,一下在省掉了我很多工作,这个函数在MySQL4.1中被加入。函                    
                                                            MYSQL的select 学习笔记                        记录一些select的技巧:1、select语句可以用回车分隔$sql="select*fromarticlewhereid=1"和$sql="select*fromarticlewhereid=1",都可以得到正确的结果,但有时分开写或许                    
                                                            网上提供的最简便的MySql数据库备份的方法                        使用MYSQL进行数据库备份,又很正规的数据库备份方法,同其他的数据库服务器有相同的概念,但有没有想过,MySQL会有更简捷的使用文件目录的备份方