Hướng dẫn bulk insert from one table to another in mysql - chèn hàng loạt từ bảng này sang bảng khác trong mysql

Giao dịch bạn không thực sự đó là lý do tại sao tôi đã xóa nó, phần còn lại được kiểm soát bởi giới hạn và bù mà bạn cần thực hiện các bản cập nhật một phần như vậy

CREATE TABLE test_arc (id int,check_time datetime, updated datetime)
CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
INSERT INTO test_data VALUES (1,NOW() - INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY),(2,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY)
,(3,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY),(4,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY)
,(5,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY),
(6,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY),(7,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY)
,(8,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY)
,(9,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY),(10,NOW()- INTERVAL 1 DAY,NOW()- INTERVAL 1 DAY)
SELECT * FROM test_data 
id | check_time          | updated            
-: | :------------------ | :------------------
 1 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 2 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 3 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 4 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 5 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 6 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 7 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 8 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
 9 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
10 | 2022-02-12 18:27:12 | 2022-02-12 18:27:12
CREATE PROCEDURE `insert_data` ()
BEGIN
DECLARE i BIGINT DEFAULT 0;
DECLARE limitSize INT DEFAULT 5;
DECLARE maxnumber BIGINT;

SET maxnumber = (SELECT COUNT(*) FROM test_data) + 1;

WHILE i <= maxnumber DO
     INSERT INTO test_arc
         SELECT id ,check_time, NOW() FROM test_data 
         WHERE check_time>='2022-02-05'
         ORDER BY updated ASC
         LIMIT i, limitSize
     ON DUPLICATE KEY UPDATE id =VALUES(id), check_time=VALUES(check_time),updated  = Values(updated );   SET i = i + limitSize;
END WHILE;
END
CALL insert_data();
SELECT * FROM test_arc
id | check_time          | updated            
-: | :------------------ | :------------------
 1 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 2 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 3 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 4 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 5 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 6 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 7 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 8 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
 9 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12
10 | 2022-02-12 18:27:12 | 2022-02-13 18:27:12

DBFiddle ở đây

Các bảng Innodb, không giống như Myisam*, không thể "chỉ được sao chép", như một phần của từ điển dữ liệu của nó (và có khả năng các cấu trúc khác mà bảng tùy thuộc vào, như bộ đệm hợp nhất) được đặt trong bộ nhớ (nếu máy chủ đang chạy) và trong Không gian bảng chung/chính, a.k.a. Tệp lớn có tên là

CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
1.

Nếu bạn đang sử dụng Percona Server> = 5.1 hoặc MySQL> = 5.6, có hỗ trợ cho các không gian bảng có thể vận chuyển, cho phép bạn xuất và nhập bảng trực tiếp từ hệ thống tập tin. Đây là phương pháp cho MySQL và Percona. Trong cả hai trường hợp, bạn đã yêu cầu bạn đã tạo bảng với tùy chọn

CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
2 và liên quan đến việc sử dụng
CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
3 và/hoặc Percona Xtrabakup (nếu bạn muốn xuất khẩu trực tuyến). Xin lưu ý rằng Percona Server hoặc Xtrabakup không có sẵn cho Windows.
Here it is the method for MySQL and for Percona. In both cases, it is required that you had created the table with the
CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
2 option and involves the usage of
CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
3 and/or Percona Xtrabakup (if you want the export to be done online). Please note that Percona Server or Xtrabakup are not available for Windows.

Phương thức này sẽ, nói chung, nhanh như sao chép tệp bằng các lệnh FileSystem (CP, RSYNC). using the filesystem commands (cp, rsync).

Mặc dù có thể có một số trường hợp điều này có thể hoạt động trong MySQL <5.6 (theo cách hacky) để khôi phục, nó sẽ không hoạt động cho một bản sao bảng. Trong những trường hợp đó, một cách để làm điều đó là bằng cách sử dụng SQL:one way to do it is by using SQL:

CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
0

Điều này sẽ nhanh như Innodb có thể thực thi

CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
4 và
CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
5, một lần mỗi hàng. Nếu bạn sử dụng phương pháp này, hãy đảm bảo rằng bạn vô hiệu hóa, ít nhất là tạm thời, các tùy chọn độ bền và bạn có một nhóm đệm lớn và nhật ký giao dịch. Trong những trường hợp đó, nó có thể giảm thời gian nhập khẩu, nhưng nó chắc chắn sẽ không phù hợp với bộ nhớ hoàn toàn, vì vậy hãy mong đợi rất nhiều thời gian. Ngoài ra, bạn đang cố gắng nhập 40m hàng trong một giao dịch duy nhất, điều đó có thể dẫn đến các vấn đề.

Đề xuất thực tế của tôi, trong trường hợp thứ hai này, sẽ là sử dụng một cái gì đó như pt-archiver, vì nó sẽ thực hiện một hoạt động tương tự như tôi vừa đề cập, nhưng nó sẽ được thực hiện trong "khối", tránh chi phí giao dịch (nó có thể Không nhanh hơn, nhưng trong trường hợp thất bại, nó sẽ không cố gắng cuộn lại toàn bộ bảng, mất mãi mãi). Đối với các kích thước dữ liệu mà bạn đề cập, đây có lẽ là cách tốt nhất để đi.to use something like pt-archiver, as it will perform an operation similar to the one I just mentioned, but it will be done in "chunks", avoiding the transactional overhead (it may not be faster, but in the case of a failure, it won't try to rollback the whole table, taking forever). For the data sizes that you mention, this is probably the best way to go.

Tùy chọn cuối cùng sẽ là xuất và nhập bằng định dạng CSV (hoặc TSV), với sự kết hợp của chọn vào Dữ liệu Outfile/MySQLDump và tải Dữ liệu/MySQLimport. Đây là một lựa chọn rất phổ biến nếu bạn cần đồng thời trong một số phiên bản cũ của MySQL, vì sử dụng SQL đã tạo ra các khóa lớn hơn (không còn đúng nữa nếu được thực hiện chính xác). Vì mysqldump/nhập chỉ hoạt động theo cách tuần tự hóa, tôi khuyên bạn nên nghiên cứu các tùy chọn để song song hóa nó, rất hữu ích cho các bảng lớn., with a combination of SELECT INTO OUTFILE/mysqldump and LOAD DATA/mysqlimport. This was a very common option if you needed concurrency in certain old versions of mysql, as using sql created larger locks (not true anymore if done correctly). As mysqldump/import only works in a serialized way, I would recommend you to research options to parallelize it, very useful for large tables.

Trong mọi trường hợp, hãy cố gắng tránh nhiều câu SQL, vì đó sẽ là nút cổ chai quan trọng nhất của bạn nếu bạn thực hiện nhiều truy vấn khác nhau (phải được thực thi, phân tích cú pháp và tối ưu hóa riêng lẻ).


*Các cấu trúc Myisam không thể được sao chép theo cách nóng, nhưng rất dễ dàng để đồng bộ hóa chúng tạm thời với đĩa với

CREATE TABLE test_data (id int,check_time datetime, updated Datetime)
6.

Làm thế nào tôi có thể chèn tất cả các bản ghi từ bảng này sang bảng khác trong MySQL?

Chọn câu lệnh cung cấp một cách dễ dàng để chèn các hàng vào một bảng từ một bảng khác. Nếu bạn muốn sao chép dữ liệu từ bảng này sang bảng khác trong cùng một cơ sở dữ liệu, hãy sử dụng chèn vào câu lệnh CHỌN trong MySQL.

Làm thế nào tôi có thể chèn nhiều hàng từ bảng này sang bảng khác trong MySQL?

Chèn nhiều hàng bằng cách chèn mysql> tạo nhân viên bảng (ID int, first_name varchar (255), last_name varchar (255));Dưới đây là cú pháp để chèn nhiều hàng bằng cách sử dụng câu lệnh chèn.Chèn vào bảng_name (cột1, cột2, ...), các giá trị (ROW1_VALUE1, ROW1_VALUE2, ...), (ROW2_VALUE1, ROW2_VALUE2, ...), ...INSERT INTO table_name(column1, column2, ...), values(row1_value1, row1_value2,...), (row2_value1, row2_value2,...), ...

MySQL có chèn số lượng lớn không?

Sử dụng câu lệnh chèn số lượng lớn trong MySQL.Câu lệnh INSERT trong MySQL cũng hỗ trợ việc sử dụng cú pháp giá trị để chèn nhiều hàng làm câu lệnh chèn số lượng lớn.Để làm điều này, bao gồm nhiều danh sách các giá trị cột, mỗi danh sách được đặt trong ngoặc đơn và được phân tách bằng dấu phẩy.The INSERT statement in MySQL also supports the use of VALUES syntax to insert multiple rows as a bulk insert statement. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas.

Làm thế nào tôi có thể thêm các giá trị số lượng lớn vào bảng trong MySQL?

Cú pháp để chèn dữ liệu số lượng lớn vào loại MySQL Lập mệnh đề vào và tên bảng mà bạn muốn chèn dữ liệu.Sử dụng các giá trị mệnh đề và sau đó trong dấu ngoặc viết dữ liệu của hàng đầu tiên, đóng các dấu ngoặc và sau khi đặt dấu phẩy.