2017-05-19 129 views
0

我有PHP腳本比較url到我們的db url並保存只有新的。問題是這個腳本的每一步都花費很長時間(總共超過10分鐘)。下面是步驟:非常緩慢的innodb操作

$query = sprintf("DELETE FROM %s ; ", $DB ['compare_result_table']); 

$query = sprintf("LOAD DATA INFILE '%s' IGNORE INTO TABLE %s 
     FIELDS TERMINATED BY ',' 
     ENCLOSED BY \"'\" 
     LINES TERMINATED BY '\n' 
     (domain, url_value)", 
     $real_out_path, $DB["compare_result_table"]); 

$query = sprintf(" INSERT INTO %s SELECT domain 
     FROM %s ;", $DB ['compare_url_table'], 'domain_data'); 

$query = sprintf("DELETE a.* 
       FROM %s a INNER JOIN %s b using (domain);", 
     $DB["compare_result_table"], $DB ['compare_url_table']); 

這裏的表格說明:

DROP TABLE IF EXISTS cmp_url; 
CREATE TABLE cmp_url 
(
    domain varchar(255), 
    index (domain) 
); 

DROP TABLE IF EXISTS cmp_result; 
CREATE TABLE cmp_result 
(
    domain varchar(255), 
    url_value varchar(4096), 
    index (domain) 

); 

每次我打電話SHOW PROCESSLIST我看到每一步(不包括文件,也許數據負載)正在很長。包含我們要比較的域的domain_data表現在是600 000條記錄。它變得越大,所有的步驟越慢。

下面是一些選項我在my.cnf改:

innodb_lock_wait_timeout = 360 
innodb_autoinc_lock_mode=2 
binlog_format=mixed 
transaction-isolation = READ-COMMITTED 

但它並沒有改變任何東西。我該如何解決這個問題?感謝您的時間。

+0

你爲什麼用'INNER JOIN'刪除? – tadman

+0

嘗試從PHP執行shell腳本到mysql服務器,比使用mysql連接器更快地執行shell腳本,考慮傳輸文件的時間太多,使用shell腳本傳輸通過網絡。 – randiel

+0

我認爲這會比子查詢更快。或者我應該使用什麼方法。另外,刪除並插入到cmp_url表中花費很長時間。 –

回答

0

要完全替換一個表:

CREATE TABLE new LIKE real; 
LOAD (or whatever) into new. 
RENAME TABLE real TO old, new TO real; 
DROP TABLE old; 

快速。零停機時間。