我有php脚本,用于将url与我们的db url进行比较并仅保存新的url。问题是此脚本的每个步骤都需要很长时间(总共超过 ~10 分钟(。步骤如下:
$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
但这并没有改变任何东西。我该如何解决这个问题?谢谢你的时间。
要完全替换表:
CREATE TABLE new LIKE real;
LOAD (or whatever) into new.
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
快。 零停机时间。