4

我需要用 PHP 函数生成的随机 SHA-1 哈希值填充 MySQL 表。我试图通过将其拆分为 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_startand$time_end变量仅用于性能测试目的。MySQL表也只有两个字段:ID int(11) UNSIGNED NOT NULL AUTO_INCREMENTsha1_hash varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,引擎是MyISAM EDIT2:计算机硬件观点与问题无关。

4

1 回答 1

4

插入通常以大批量完成,因为每次插入后都会更新索引。批处理允许您插入许多记录,然后只在最后而不是在每行之后更新索引一次。

但是,在自动递增主键索引的情况下,必须扩展索引才能添加新行,因此您没有保存任何内容,因为您没有任何其他索引。

批处理还节省了解析查询和锁定的一些开销。但是,您也可以考虑使用参数化查询 (PDO)。

使用 PDO 的参数化查询一次插入一条记录也会非常快,因为 MySQL 只需解析一次查询,从那时起,它使用行数据的低开销二进制传输。

您可以在插入开始之前锁定表LOCK TABLES。这将节省一点表锁开销。

Also, since SHA1 will always be 40 character hex encoded ASCII value, you should consider using CHAR(40) instead of VARCHAR(). This will speed things up as well. Also, if the SHA1 column is indexed, use a single-byte character set instead of UTF8 to reduce the size of the index and speed things up.

于 2012-05-07T14:36:53.213 回答