知识大全 MySQL两种表存储结构性能比较测试过程
Posted 知
篇首语:对搞科学的人来说,勤奋就是成功之母!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 MySQL两种表存储结构性能比较测试过程相关的知识,希望对你有一定的参考价值。
MySQL两种表存储结构性能比较测试过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
MySQL支持的两种主要表存储格式MyISAM InnoDB 上个月做个项目时 先使用了InnoDB 结果速度特别慢 秒钟只能插入 几条 后来换成MyISAM格式 一秒钟插入上万条 当时觉的这两个表的性能也差别太大了吧 后来自己推测 不应该差别这么慢 估计是写的插入语句有问题 决定做个测试 测试环境 Redhat Linux CPU 内存 G MySQL版本为 gamma standard 测试程序 Python+Python MySQL模块 测试方案 MyISAM格式分别测试 事务和不用事务两种情况 InnoDB格式分别测试AutoCommit= (不用begin transaction和用begin transaction模式) AutoCommit= (不用begin transaction和用begin transaction模式)四种情况 测试方法为插入 条记录 为了测试不互相影响 单独建立了专用的测试表 建表语句如下 MyISAM不用事务表 CREATE TABLE `MyISAM_NT` ( `TableId` int( ) NOT NULL default `TableString` varchar( ) NOT NULL default ) ENGINE=MyISAM; MyISAM用事务表: CREATE TABLE `MyISAM_TS` ( `TableId` int( ) NOT NULL default `TableString` varchar( ) NOT NULL default ) ENGINE=MyISAM; InnoDB关闭AutoCommit 不用事务: CREATE TABLE `INNODB_NA_NB` ( `TableId` int( ) NOT NULL default `TableString` varchar( ) NOT NULL default ) ENGINE=InnoDB; InnoDB关闭AutoCommit 用事务: CREATE TABLE `INNODB_NA_BE` ( `TableId` int( ) NOT NULL default `TableString` varchar( ) NOT NULL default ) ENGINE=InnoDB; InnoDB开启AutoCommit 不用事务: CREATE TABLE `INNODB_AU_NB` ( `TableId` int( ) NOT NULL default `TableString` varchar( ) NOT NULL default ) ENGINE=InnoDB; InnoDB开启AutoCommit 用事务: CREATE TABLE `INNODB_AU_BE` ( `TableId` int( ) NOT NULL default `TableString` varchar( ) NOT NULL default ) ENGINE=InnoDB; 测试的Python脚本如下 #!/usr/bin/env Python MyISAM InnoDB性能比较 作者 空心菜(Invalid) 时间 import MySQLdb import sys import os import string import time c = None testtables = [( MyISAM_NT None ) ( MyISAM_TS None ) ( INNODB_NA_NB ) ( INNODB_NA_BE ) ( INNODB_AU_NB ) ( INNODB_AU_BE ) ] def BeginTrans(): print ExecSQL:BEGIN; c execute( BEGIN; ) return def Commit(): print ExecSQL:MIT; c execute( MIT; ) return def AutoCommit(flag): print ExecSQL:Set AUTOMIT = +str(flag) c execute( Set AUTOMIT = +str(flag)) return def getcount(table): #print ExecSQL:select count(*) from +table c execute( select count(*) from +table) return c fetchall()[ ][ ] 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 ; return c rowcount def main(): argv = sys argv if len(argv) < : print Usage: argv[ ] TableId TestCount \\n sys exit( ) 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) > : tableid = argv[ ] testcount = int(argv[ ]) # for test in testtables: #每次操作前都重写建立数据库连接 try: mdb = nnect(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( ) else: c = mdb cursor() table automit trans = test starttime = time time() print table time strftime( %y %m %d %H:%M:%S time localtime()) if automit != None: AutoCommit(automit) if trans == : BeginTrans() for i in xrange(testcount): tablestring = % d %i if (AddTable(table tableid tablestring)< ): print AddTable Error tablestring if trans == : 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 : : : : MyISAM_NT count: used time: MyISAM_TS : : ExecSQL:BEGIN; ExecSQL:MIT; : : MyISAM_TS count: used time: INNODB_NA_NB : : ExecSQL:Set AUTOMIT = : : INNODB_NA_NB count: used time: INNODB_NA_BE : : ExecSQL:Set AUTOMIT = ExecSQL:BEGIN; ExecSQL:MIT; : : INNODB_NA_BE count: used time: INNODB_AU_NB : : ExecSQL:Set AUTOMIT = : : INNODB_AU_NB count: used time: INNODB_AU_BE : : ExecSQL:Set AUTOMIT = ExecSQL:BEGIN; ExecSQL:MIT; : : INNODB_AU_BE count: used time: 结论 由此得知影响速度的主要原因是AUTOMIT默认设置是打开的 我当时的程序没有显式调用BEGIN;开始事务 导致每插入一条都自动Commit 严重影响了速度 cha138/Article/program/MySQL/201311/29332相关参考
我想对于牛皮癣有一种非常简单的分类,根据牛皮癣本身的治疗难度,将牛皮癣分为顽固性和寻常型牛皮癣,当然牛皮癣患者都知道的,顽固性牛皮癣治疗起来难度比较大,而对于顽固性牛皮癣的研究也是比较多的,今天我们就
PHP调用MySQL的存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! MySQL好像从开
php调用MySQL存储过程的方法集合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章是对p
MySQL数据库新特性之存储过程入门教程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在MYSQL
MySQL5.0新特性教程存储过程:第二讲 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Why
MySQL5.0新特性教程存储过程:第一讲 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Int
MySQL5.0数据库新特性的存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当你提交一
高性能MySQL:MySQL基准测试套件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! MySQ
浅析对MYSQL进行压力测试的过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!安装supersm
高性能MySQL 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第章MySQL基准测试 为什么