微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在数百万条记录,MySQL和PHP的数据库中优化插入

我需要使用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_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:计算机硬件的观点与问题无关.

解决方法:

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

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

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

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

您可以在插入开始之前使用LOCK TABLES锁定表.这将节省一些表锁开销.

此外,由于SHA1将始终是40个字符的十六进制编码ASCII值,您应该考虑使用CHAR(40)而不是VARCHAR().这也将加快速度.此外,如果SHA1列已编制索引,请使用单字节字符集而不是UTF8来减小索引的大小并加快速度.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐