Mysql
在執行 SELECT 的許多客戶端的情況下插入大量數據
我需要執行這樣的查詢來將大量數據(數百萬行)插入 MySQL 表(InnoDB,5.6.10):
INSERT INTO target_table (a) SELECT id FROM source_table ON DUPLICATE KEY a=a;
當沒有客戶端訪問時,這通常需要大約 200 秒才能執行
target_table
。
target_table
現在有大約 20 個客戶端“輪詢”以查看數據是否到達,所以我們現在有很多客戶端執行這樣的查詢:SELECT a FROM target_table WHERE a LIKE '0%';
INSERT INTO
現在這些客戶端正在輪詢,我在聲明中遇到了問題- 它失敗並出現錯誤Lock wait timeout exceeded; try restarting transaction
。我有點困惑,為什麼由於客戶端正在執行語句
INSERT INTO
而無法獲取所需的任何鎖。SELECT
編輯:
這些表的
CREATE
語句如下:CREATE TABLE `target_table` ( `a` varchar(32) NOT NULL, PRIMARY KEY (`a`), CONSTRAINT `target_table_source_table` FOREIGN KEY (`a`) REFERENCES `source_table` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `source_table` ( `id` varchar(32) NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
中
source_table
,是否經常出現重複值?我假設a
是PRIMARY KEY
的dest_table
?如果經常出現重複,請更改為INSERT INTO target_table SELECT DISTINCT a FROM source_table ON DUPLICATE KEY a=a;
DISTINCT
動作工作進入SELECT
,從而減少了衝突INSERT
。更好的是,這樣做:
INSERT IGNORE INTO target_table SELECT DISTINCT a FROM source_table;
IGNORE
可能比 IODKU 的工作量少。請提供
SHOW CREATE TABLE
兩個表格;可能存在一些微妙的問題,尤其是PRIMARY KEY
、時間戳和二級索引。