继承我的代码:
function toAscii($str, $replace=array(), $delimiter='-') {
if( !empty($replace) ) {
$str = str_replace((array)$replace, ' ', $str);
}
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
$sql = mysql_query("select * from cities_dev order by PostalCode asc") or die(mysql_error());
// id, id_province, id_city, postal_code, latitude, longitude
while ($row = mysql_fetch_assoc($sql))
{
$slug = toAscii($row['City']);
$id_province = mysql_result(mysql_query("select id from provinces where abbr='".mysql_real_escape_string($row['ProvinceCode'])."'"), 0) or die($row['City'].' - prov');
$id_city = mysql_result(mysql_query("select id from cities where slug='".$slug."' and id_province='".$id_province."'"), 0) or die($id_province . ' - ' . $row['City'] .' - ' . $row['PostalCode'] . ' - city');
$postal_code = mysql_real_escape_string($row['PostalCode']);
$latitude = mysql_real_escape_string($row['Latitude']);
$longitude = mysql_real_escape_string($row['Longitude']);
mysql_query("insert into geo (`id_province`, `id_city`, `postal_code`, `latitude`, `longitude`)
values ('$id_province', '$id_city', '$postal_code', '$latitude', '$longitude')") or die('insert');
}
我要做的是为每个postalcode / lat / lng行插入一个新行。大约有750,000行。我需要为每个插入的新行从其他2个表中获取省ID和城市ID。
这个sql工作,但是正在取消。任何人都可以告诉我一个更好的编码方式吗?
答案 0 :(得分:1)
您应该考虑执行批量插入以在每个查询中插入多行。 这可以提供巨大的性能提升,但请注意单个查询的大小有限制。我认为限制是基于MySQL中的max_allowed_packet变量 - 例如,在我的一台服务器上,这个设置为1MB。
我建议从每个插件大约100行开始,看看改进情况,并根据查询大小和最大允许数据包大小进行调整。
答案 1 :(得分:1)
我不认为任何其他建议会真正帮助你加快速度..
您可以将整个内容更改为INSERT ... SELECT查询。有很多关于如何做到这一点的文档。如果有很多邮政编码,选择本身会很慢,但是如果你使用的是InnoDB,那么页面缓冲区大小(全局设置)的数量会很好,所以所有数据都适合内存,这应该会有所帮助
MyISAM插入速度也很慢,所以如果你还没有,我还建议你把第二个表改成InnoDB。
答案 2 :(得分:0)
嗯,现在正确地做这件事的实际方法是使用MySQLi准备好的语句。此扩展为所有旧功能提供支持,并对代码进行了大量改进。
答案 3 :(得分:0)
尝试存储过程(http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx - 这是我能在短时间内找到的最好的)。它允许您一次在服务器上执行代码(给它一些初始输入),而不是在每个操作之间与服务器通信。它应该会大大减少你的执行时间。