快速执行此mysql的方法

时间:2011-08-03 23:29:41

标签: php mysql

继承我的代码:

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工作,但是正在取消。任何人都可以告诉我一个更好的编码方式吗?

4 个答案:

答案 0 :(得分:1)

您应该考虑执行批量插入以在每个查询中插入多行。 这可以提供巨大的性能提升,但请注意单个查询的大小有限制。我认为限制是基于MySQL中的max_allowed_pa​​cket变量 - 例如,在我的一台服务器上,这个设置为1MB。

我建议从每个插件大约100行开始,看看改进情况,并根据查询大小和最大允许数据包大小进行调整。

答案 1 :(得分:1)

我不认为任何其他建议会真正帮助你加快速度..

您可以将整个内容更改为INSERT ... SELECT查询。有很多关于如何做到这一点的文档。如果有很多邮政编码,选择本身会很慢,但是如果你使用的是InnoDB,那么页面缓冲区大小(全局设置)的数量会很好,所以所有数据都适合内存,这应该会有所帮助

MyISAM插入速度也很慢,所以如果你还没有,我还建议你把第二个表改成InnoDB。

答案 2 :(得分:0)

嗯,现在正确地做这件事的实际方法是使用MySQLi准备好的语句。此扩展为所有旧功能提供支持,并对代码进行了大量改进。

You could read more on prepared statements herehere

答案 3 :(得分:0)

尝试存储过程(http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx - 这是我能在短时间内找到的最好的)。它允许您一次在服务器上执行代码(给它一些初始输入),而不是在每个操作之间与服务器通信。它应该会大大减少你的执行时间。