我正在使用下面的腳本將大型csv文件導入到我的數據庫。增強csv文件數據庫導入
如果該表爲空,則在本地計算機上完成該過程需要大約5分鐘的時間。
如果我使用該文件更新同一張表上的現有值,則需要15分鐘以上才能完成。
我的csv文件包含大約35,000行。
我該如何加快流程?
if ($request->get($_POST["action"]) == "import") {
$file = $upload->file_upload("import", "media/import");
if (file_exists(DIR_UPLOAD_PHOTO . "/media/import/" . $file)) {
$file = DIR_UPLOAD_PHOTO . "/media/import/" . $file;
$handle = fopen($file, "r");
if ($handle) {
$lines = explode("\r", fread($handle, filesize($file)));
}
$total_array = count($array);
$x = 0;
foreach ($lines as $line) {
if ($x >= 1) {
$data = explode("|", $line);
$titlu = trim(addslashes($data[0]));
$alias = $this->generate_seo_link($titlu);
$gramaj = trim($data[1]);
$greutate = trim($data[2]);
$pret_total = trim($data[3]);
$pret_redus = trim($data[4]);
$poza = trim($data[5]);
$pret_unitar = trim($data[6]);
$categorie = trim($data[7]);
$brand = trim(addslashes($data[8]));
$descriere = trim(addslashes($data[9]));
$vizibil = trim($data[10]);
$cod = trim($data[11]);
$nou = trim($data[12]);
$cant_variabila = trim($data[13]);
$congelat = trim($data[14]);
$tva = trim($data[15]);
$stoc = trim($data[16]);
if ($cod != "" && $cod != " ") {
$verificare = $database->select("SELECT alias FROM produse WHERE alias LIKE '%" . $alias . "%'");
for ($i = 0; $i < $database->countRows(); $i++) {
if ($alias == $verificare['alias'][$i]) {
$alias = $this->increment_string($alias, '_', 1);
} else {
$alias = $alias;
}
}
$database->insert(sprintf("insert into produse set
titlu='%s',
alias='%s',
gramaj='%s',
greutate='%s',
prettotal='%s',
pretredus='%s',
poza='%s',
pretunitar='%s',
categorie='%d',
brand='%s',
descriere='%s',
vizibil='%d',
cod='%s',
nou='%d',
cant_variabila='%d',
congelat = '%d',
tva = '%s',
stoc = '%d'
on duplicate key update
titlu='%s',
gramaj='%s',
greutate='%s',
prettotal='%s',
pretredus='%s',
poza='%s',
pretunitar='%s',
categorie='%d',
brand='%s',
descriere='%s',
vizibil='%d',
cod='%s',
nou='%d',
cant_variabila='%d',
congelat = '%d',
tva='%s',
stoc= '%d'",
$titlu, $alias,
$gramaj, $greutate, $pret_total, $pret_redus, $poza, $pret_unitar, $categorie,
$brand, $descriere, $vizibil, $cod, $nou, $cant_variabila, $congelat,
$tva, $stoc,
$titlu, $gramaj, $greutate,
$pret_total, $pret_redus, $poza, $pret_unitar, $categorie, $brand, $descriere,
$vizibil, $cod, $nou, $cant_variabila, $congelat, $tva, $stoc));
}
}
$x++;
}
}
}
這裏是我的遞增函數
function increment_string($str, $separator = '-', $first = 1){
preg_match('/(.+)'.$separator.'([0-9]+)$/', $str, $match);
return isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $str.$separator.$first;
}
可能比codeoverview更多比stackoverflow – Duniyadnd 2014-11-05 14:35:11
這可能是由於索引必須檢查和每個插入更新。您可以使用[EXPLAIN](http://dev.mysql.com/doc/refman/5.6/en/explain.html)查看在插入過程中正在使用的索引(如果有的話)。 – 2014-11-05 14:37:28
@JayBlanchard - 爲什麼會在插入時使用** **索引?爲什麼人們立即認爲每個數據庫放緩都可以通過索引解決。這裏的問題是可用的I/O操作有限。機械驅動器每秒可以擠壓300個I/O。這意味着每秒300個查詢。如果這些查詢是組合MULTIPLE查詢的交易,那麼可以有效使用HDD帶寬。基本上,強制磁盤在單個I/O中刷新500個查詢可以加快速度。這與索引無關**。 – 2014-11-05 14:47:37