Mysql

在執行 SELECT 的許多客戶端的情況下插入大量數據

  • July 30, 2016

我需要執行這樣的查詢來將大量數據(數百萬行)插入 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,是否經常出現重複值?我假設aPRIMARY KEYdest_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、時間戳和二級索引。

引用自:https://dba.stackexchange.com/questions/145394