我需要使用由MySQL函数生成的随机SHA-1散列值填充PHP表。我正在尝试通过将其拆分成10000个块来优化插入。我的问题是:以下方法是否有效?下面是代码。
//MySQL server connection routines are above this point
if ($select_db) {
$time_start = microtime(true);
//query
$query = 'INSERT INTO sha1_hash (sha1_hash) VALUES ';
for ($i=1; $i<1000001; $i++) {
$query .= "('".sha1(genRandomString(8))."'),";
$count++;
if ($count ==10000) {
//result
$result = mysql_query(rtrim($query,',')) or die ('Query error:'.mysql_error());
if ($result) mysql_free_result($result);
$count = 0;
}
}
$time_end = microtime(true);
echo '<br/>'. ($time_end - $time_start);
}
//function to generate random string
function genRandomString($length)
{
$charset='abcdefghijklmnopqrstuvwxyz0123456789';
$count = strlen($charset);
while ($length--) {
$str .= $charset[mt_rand(0, $count-1)];
}
return $str;
}编辑:$time_start和$time_end变量仅用于性能测试。此外,MySQL表只有两个字段:ID int(11) UNSIGNED NOT NULL AUTO_INCREMENT和sha1_hash varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,引擎是MyISAM EDIT2:计算机硬件的观点与问题无关。
发布于 2012-05-07 22:36:53
insert通常是大批量的,因为索引在每次insert之后更新。批处理允许您插入许多记录,然后只在末尾更新索引一次,而不是在每行之后。
但是,在自动递增主键索引的情况下,必须扩展索引才能添加新行,因此不会保存任何内容,因为没有任何其他索引。
批处理还节省了解析查询和锁定的一些开销。但是,您也可以考虑使用参数化查询(PDO)。
使用PDO的参数化查询一次插入一条记录也是非常快的,因为MySQL只需要解析查询一次,并且从那时起,它使用行数据的低开销二进制传输。
您可以在以LOCK TABLES开始插入之前锁定表。这将节省一点表锁开销。
此外,由于SHA1将始终是40个字符的十六进制编码的ASCII值,因此您应该考虑使用CHAR(40)而不是VARCHAR()。这也会加快速度。此外,如果对SHA1列进行了索引,请使用单字节字符集而不是UTF8来减小索引的大小并加快速度。
https://stackoverflow.com/questions/10483572
复制相似问题