問題和困難mysql
1.文件太大,數據不能一次讀取sql
2.數據存在冗餘,因此不能單純的插入操做數據庫
解決ui
1.按行讀取文件,計數累加,超過10000萬行進行寫庫操做code
while ($str = fgetcsv($file)) { //每次讀取CSV裏面的一行內容 $str = explode(" ",$str[0]); $insert_data[] = array( 'phone' => $str[0], 'type' => $str[2], 'number' => $str[3], ); $time++; if ($time > 10000) { $value = ""; $time = 0; foreach ($insert_data as $key => $item) { $value .= "(" . join(",",$item) ."),"; } $value = trim($value,','); // var_dump($value);die; save($value,$mysqli); // die; } }
2.寫數據庫操做,自動根據數據庫內容進行選擇插入仍是修改操做pdo
INSERT INTO flag_17_09 (`phone`,`type`,`number`) VALUES $value ON DUPLICATE KEY UPDATE number=number+VALUES(number)
若是主鍵存在,則更新,如不存在則執行插入操做,更新時將本次數據與原有數據相加保存get
其中,向MySQL寫入大量數據時,能夠考慮採用PDO模式it
ini_set('max_execution_time','0'); $pdo = new PDO("mysql:host=localhost;dbname=oradt_cloud1520","root","123456"); $sql = "insert into scan_card_picture (uuid,account_id,handle_state,created_time,status,from_account,accuracy,ifupdate) values"; for($i=0; $i<100000; $i++){ $str = strrand(32); $sql .="('".$str."','07:55:10','active','admin@qq.com','90',1),"; } $sql = substr($sql,0,strlen($sql)-1); var_dump($sql); if($pdo -> exec($sql)){ echo "插入成功!"; echo $pdo -> lastinsertid(); }