MySQL中CHAR与VARCHAR性能测试


测试环境:
CPU:              Intel(R) Pentium(R) 4 3.0G (单核双线程)
内存:             1.5G
操作系统:    Window XP SP2
PHP:              5.2.6
MYSQL:         5.0.51b-community

测试过程中使用的表结构
CREATE TABLE `mysqlchar` (
`username` char(32) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `mysqlchar` (
`username` varchar(32) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `mysqlchar` (
`username` char(32) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `mysqlchar` (
`username` varchar(32) default NULL
) ENGINE= InnoDB DEFAULT CHARSET=utf8;

0;$i--){
		$result .= $str{mt_rand(0,62)};
	}
	return $result;
}
function insert(){
	$dsn = 'mysql:dbname=test;host=127.0.0.1';
	$user = 'root';
	$password = 'xxxxx';
        $dbh = new PDO($dsn, $user, $password);
	$sth = $dbh->prepare('INSERT INTO mysqlchar(`username`)
		VALUES(?)');
	echo microtime();
	echo '    ';
	for($i=0;$i<20;$i++){
		$sth->execute(array(getRandom(mt_rand(6,32))));
	}
	echo microtime();
}
function select(){
	$dsn = 'mysql:dbname=test;host=127.0.0.1';
	$user = 'root';
	$password = 'xxxxxx';
        $dbh = new PDO($dsn, $user, $password);
	$sth = $dbh->prepare('SELECT username from mysqlchar
		WHERE username = ?');
	echo microtime();
	echo '    ';
	$sth->execute(array('BOklEnL2onF'));
	echo microtime();
}
function addKey(){
	$dsn = 'mysql:dbname=test;host=127.0.0.1';
	$user = 'root';
	$password = 'xxxxx';
        $dbh = new PDO($dsn, $user, $password);
	echo microtime();
	echo '    ';
	$dbh->query('ALTER TABLE mysqlchar ADD KEY test(`username`)');
	echo microtime();
}
//insert();
//select();
//addKey();
?>

测试结果(单位:秒)

MyISAM InnoDB
选项 CHAR(32) VARCHAR(32) 选项 CHAR(32) VARCHAR(32)
1、插入200W数据时间(PHP命令行下执行) 443.34701 422.386431 1、插入1W数据时间(PHP命令行下执行) 227.850326 215.932341
2、插入20条数据(三次平均) 0.004720 0.004445 2、插入20条数据(三次平均) 0.381118 0.405421
3、查询1条数据(三次平均) 0.858885 0.827146 3、查询1条数据(三次平均) 0.017053 0.011800
4、建立索引 30.322559 24.306851 4、建立索引 0.502228 0.455406
6、插入20条数据(三次平均) 0.006587 0.006420 6、插入20条数据(三次平均) 0.359265 0.418550
7、查询1条数据(三次平均) 0.005637 0.002780 7、查询1条数据(三次平均) 0.000867 0.000679
结果说明 在MyISAM引擎下,VARCHAR(32)在各方面的性能都比CHAR(32)较好。
在InnoDB引擎下,除了插入数据VARCHAR(32)的性能略输CHAR(32)外,在查询方面的性能均比CHAR(32)好。

《“MySQL中CHAR与VARCHAR性能测试”》 有 4 条评论

  1. 这个结果不太准确 我们测试的char 速度明显优势,,而且在 索引情况下更高于VARCHAR

    • 我这个测试很随心,没有严格的限制条件和执行环境。也许是正确的,也许是不正确的,只是提供一个参考值。如果不介意的话,能否描述一下,你们的测试环境和条件?

  2. 不告诉你 :这个结果不太准确 我们测试的char 速度明显优势,,而且在 索引情况下更高于VARCHAR

    这个测试不准确,我测试的也是char速度明显优越。。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注