Tôi muốn di chuyển dữ liệu giữa 2 bảng InnoDB.
Hiện tại tôi đang chạy truy vấn này:
INSERT INTO table_a SELECT * FROM table_b;
Nếu tập dữ liệu phát triển, cách tốt nhất để tránh quá tải CPU là gì?
Cảm ơn
Tôi muốn di chuyển dữ liệu giữa 2 bảng InnoDB.
Hiện tại tôi đang chạy truy vấn này:
INSERT INTO table_a SELECT * FROM table_b;
Nếu tập dữ liệu phát triển, cách tốt nhất để tránh quá tải CPU là gì?
Cảm ơn
Câu trả lời:
Vì bạn đang sử dụng InnoDB, tôi muốn đề xuất như sau:
Nếu bạn thực hiện CHERTN, CẬP NHẬT và XÓA, hãy tải số lượng lớn bảng như thế này:
CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT * FROM table_b;
ALTER TABLE table_a RENAME table_old;
ALTER TABLE table_new RENAME table_a;
DROP TABLE table_old;
Nếu bạn không làm gì ngoài CHERTN và CHỌN, hãy tải các mục mới vào bảng. Giả sử khóa chính của table_a
và table_b
là id
, thực hiện tải như thế này:
CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT B.* FROM table_b B
LEFT JOIN table_a A USING (id) WHERE A.id IS NULL;
INSERT INTO table_a SELECT * FROM table_new;
DROP TABLE table_new;
Hãy chắc chắn rằng bạn đang sử dụng MySQL 5.5. Nếu bạn có MySQL 5.1,38 trở lên, bạn phải cài đặt Plugin InnoDB . Nếu bạn có MySQl 5.1.37 hoặc trước đó, chỉ cần nâng cấp lên MySQL.
Khi bạn đã làm điều đó (hoặc nếu bạn đã có MySQL 5.5), bạn phải điều chỉnh InnoDB cho nhiều CPU. Thay vì phát minh lại bánh xe, đây là những bài viết trước đây của tôi về cách thức và lý do để làm như vậy:
May 26, 2011
: Giới thiệu về hiệu suất cơ sở dữ liệu đa luồng so với đa luồngSep 12, 2011
: Có thể làm cho MySQL sử dụng nhiều hơn một lõi?Mar 16, 2012
: Sử dụng nhiều lõi cho các truy vấn MySQL đơn trên DebianApr 26, 2012
: Hiệu suất CPU có phù hợp với máy chủ cơ sở dữ liệu không?Hãy thử một lần !!!
Tôi có thể đề xuất những thứ khác như bộ đệm, tệp nhật ký, v.v. Tôi chỉ giải quyết hai mối quan tâm này.
Trong trường hợp này, thông thường, giải pháp tốt nhất là mysqldump sử dụng --tab
tùy chọn như thế này:
mysqldum --tab=/path/to/serverlocaldir --single-transaction <database> table_a
tùy chọn tab tạo ra 2 tệp, một tệp -table_a.sql- chỉ chứa câu lệnh tạo bảng và tệp oher -table_a.txt- chứa dữ liệu được phân tách bằng tab.
Bây giờ bạn có thể tạo bảng mới của bạn
create table table_b like table_a;
Sau đó, bạn chỉ cần tải dữ liệu trong bảng mới của mình LOAD DATA
mà không cần quan tâm đến tên của bảng.
LOAD DATA INFILE '/path/to/serverlocaldir/table_a.txt'
INTO TABLE table_b FIELDS TERMINATED BY '\t' ...
LOAD DATA thường nhanh hơn 20 lần so với sử dụng các câu lệnh INSERT.
Hi vọng điêu nay co ich