2017-05-19 13 views
0

私は、私たちのdbのURLと比較し、新しいものだけを保存するためのPHPスクリプトを持っています。問題は、このスクリプトの各ステップが非常に長くかかっていることです(合計で10分以上)。ここでの手順です:私はすべてのステップ(除く、ファイルから多分データロード)が非常に長く取っていることがわかりショーPROCESSLIST呼び出す非常に遅いinnodb操作

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) 

); 

毎回:

$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']); 

ここではテーブルの説明です。比較するドメインを含むdomain_dataテーブルは、現在600 000レコードです。大きくなるほど、すべてのステップが遅くなります。

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

しかし、それは何も変更doesntの:

ここで私はmy.cnfの中で変化し、いくつかのオプションがあります。どうすればその問題を解決できますか?あなたの時間をありがとう。完全テーブルを交換するため

+0

なぜ「INNER JOIN」で削除していますか? – tadman

+0

PHPからmysqlサーバへシェルスクリプトを実行しようとすると、mysqlコネクタを使用するよりシェルスクリプトを実行する速度が速くなります。また、シェルスクリプトを使用してファイルを転送する時間も考慮してください。 – 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; 

高速。ダウンタイムゼロ。