测试环境:
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 条评论
这个结果不太准确 我们测试的char 速度明显优势,,而且在 索引情况下更高于VARCHAR
我这个测试很随心,没有严格的限制条件和执行环境。也许是正确的,也许是不正确的,只是提供一个参考值。如果不介意的话,能否描述一下,你们的测试环境和条件?
这个测试不准确,我测试的也是char速度明显优越。。。