海量日誌入庫
日誌目錄下有10個記錄檔,每個檔案壓縮後大約60M左右,檔案尾碼是.gz,如a.gz、b.gz等,檔案中行的內容是id=2112112,[email protected],等等其它,
id=2112112,[email protected],等等其它,
id=2112112,[email protected],等等其它,
id=2112112,[email protected],等等其它,
id=2112112,[email protected],等等其它,
id=2112112,[email protected],等等其它,
id=2112112,[email protected],等等其它,
現在是想把這個目錄下的每個檔案的所有內容insert到資料庫中,資料庫中的表,是通過email分表的,大約是log_1,log_2,一直到log_1000的分表的,請問下詳細的解決方案,比如說怎麼樣能保證到每個檔案在很快的時間內入庫,使得指令碼執行更有效率
先貼一段代碼
error_reporting(E_ALL & ~E_NOTICE);
//接收參數
$mysql_host = XX.XX.XX.XX;
$mysql_user = XXX;
$mysql_pass = XX;
$mysql_port = 3306;
$mysql_db = 'test';
$table_pre = 'log_';
$gz_log_file = a.gz;
//指令碼執行日誌
$exec_log = '/data_log/record.txt';
file_put_contents ($exec_log,'*****************************************START***********************************'."\r\n",FILE_APPEND );
file_put_contents ($exec_log,'param is mysql_host='.$mysql_host.' mysql_user='.$mysql_user.' mysql_pass='.$mysql_pass.' mysql_port='.$mysql_port.' mysql_db='.$mysql_db.' table_pre='.$table_pre.' gz_log_file='.$gz_log_file.' start_time='.date("Y-m-d H:i:s")."\r\n",FILE_APPEND );
//讀日誌入庫
$z_handle = gzopen($gz_log_file,'r');
$time_start = microtime_float();
$mysql_value_ary = array();
//連結資料庫
$conn = mysql_connect("$mysql_host:$mysql_port",$mysql_user,$mysql_pass);
if (!$conn) {
file_put_contents ($exec_log,'Could not connect database error, error='.mysql_error()."\r\n",FILE_APPEND );
exit;
}
$selec_db = mysql_select_db($mysql_db);
if(!$selec_db){
file_put_contents ($exec_log,'select database error, database='.$mysql_db."\r\n",FILE_APPEND );
exit;
}
while(!gzeof($z_handle)){
$each_gz_line = gzgets($z_handle, 4096);
$line_to_array = explode("\t",$each_gz_line);
//過濾無效日誌
if(!empty($line_to_array[3]) && !empty($line_to_array[2]) && !empty($line_to_array[4])){
$insert_value = "('".$line_to_array[3]."','".$line_to_array[2]."','".$line_to_array[1]."','".$line_to_array[4]."','".$line_to_array[0]."') ";
$insert_sql = "insert into $table_name (uid,email,ip,ctime) values $insert_value ";
$table_id = abs(crc32($line_to_array[2]) % 1000);
$table_name = $table_pre.$table_id;
$result = mysql_query($insert_sql);
if(!$result){
//如果插入錯誤,則記錄日誌
file_put_contents ($exec_log,'table_name='.$table_name.' email='.$line_to_array[2]."\r\n",FILE_APPEND );
}
}
}
$time_end = microtime_float();
$diff = $time_end - $time_start;
file_put_contents ($exec_log,'success to insert database,log_file is '.$gz_log_file.' time-consuming is='.$diff."s \r\n",FILE_APPEND );
file_put_contents ($exec_log,'*******************************************END***********************************'."\r\n",FILE_APPEND );
gzclose($z_handle);
上面的代碼執行起來,很慢,不可忍受,請大牛幫忙 海量日誌?日誌分析?指令碼?效率
------解決方案--------------------
表類型修改為:InnoDB,然後用事務實施,
還不行的話,換load file