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)
]