nhập khẩu mys mys cực kỳ chậm trên máy của nhà phát triển của tôi


21

Tôi có một kết xuất SQL, nó khá lớn (411 MB) và phải mất 10 phút để nhập trên máy chủ A, cùng một lần nhập trên máy trạm B của tôi có ước tính (pipeviewer) là 8 giờ để nhập (nó đã nhập 31 MB trong 40 phút ) Vì vậy, đây là yếu tố 53 chậm hơn.

Thông số kỹ thuật:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

Cấu hình mysql / maria là cấu hình chứng khoán.

Tôi đã chuyển sang MariaDB ngày hôm qua trên máy trạm của mình - nhưng trước MariaDB, số liệu thống kê thậm chí còn tồi tệ hơn.

Tôi đã xóa tất cả các cơ sở dữ liệu trên máy trạm của mình - không có sự khác biệt.

Câu hỏi lớn là: Làm thế nào hiệu suất có thể là yếu tố 53 chậm hơn? Tôi không thể làm việc như thế này :-(

Lệnh nhập của tôi:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

máy chủ A:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

máy trạm B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

máy chủ A:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

máy trạm B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

Bạn có thể mô tả cho tôi cách bạn muốn nhập cơ sở dữ liệu? (câu lệnh mysql cụ thể của bạn là gì) "Hiển thị danh sách quy trình;" Nói? Bạn đã xem những gì quá trình đang làm cụ thể với strace? Bạn cũng có thể vui lòng xem nếu máy của bạn có thể hoán đổi?

Tôi đã chỉnh sửa câu hỏi của tôi.
Alex

InnoDB? Giá trị của innodb_buffer_pool_sizemỗi máy là gì?
Rick James

Câu trả lời:


47

Câu trả lời này đã tăng tốc mọi thứ lên rất nhiều:

/programming//a/2167641/292408

Tôi chỉ đơn giản

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

lúc đầu, và

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

cuối cùng.

Bây giờ mất 3 phút.

(Được phép của @andreasemer qua twitter)


Thủ thuật tuyệt vời. Một cái gì đó mà tôi cần biết, có bất kỳ tác dụng phụ của việc này không?
Dharma Saputra

1
Trong trường hợp dữ liệu của bạn bị hỏng, các ràng buộc khóa ngoại có thể không được đáp ứng sau khi nhập.
Alex

Công việc tuyệt vời xung quanh. Bạn đã cứu tôi theo nghĩa đen hàng giờ.
Jafo

Không tăng tốc hiệu suất cho tôi. Nếu không có điều này thì đã là 23 phút và sau đó là 23 phút (tệp 3GB .sql).
Joshua Pinter

5

Bổ sung cho những gì tôi thấy ở trên ... Tôi có tệp kết xuất của mình đã được tạo tự động bởi một cái gì đó như:

mysqldump my_db > db-dump-file.sql

Tôi muốn tự động hóa quá trình nhập này vì vậy tôi đã tạo hai tệp trong máy tính của mình được gọi default-start-import.sqldefault-end-import.sqlnội dung của chúng là default-start-import.sql :

SET autocommit=0;

default-end-import.sql :

COMMIT;
SET autocommit=1;

và kịch bản tôi chạy là một cái gì đó như thế này;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

cùng một lệnh nhưng dễ đọc hơn:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

Trong trường hợp này cat này được sử dụng để nối các tệp đó trước khi gửi chúng đến đường ống. Tôi nghĩ điều quan trọng là tất cả các tệp kết thúc bằng một ký tự dòng mới (một dòng trống ở cuối tệp nếu nhìn thấy từ trình soạn thảo văn bản) để catlệnh không hợp nhất các dòng giữa các tệp.

Quá trình nhập hoạt động tốt, tôi chưa kiểm tra xem nó có thực sự nhanh hơn hay không vì sự cải tiến này đối với điều tự động kích hoạt và vô hiệu hóa, nhưng nếu điều đó làm mọi thứ nhanh hơn, thì các bước bổ sung này sẽ giúp mọi việc dễ dàng hơn.


1

Tôi đã cố gắng --compresscũng như SET autocommit=0;và họ đã giúp một số tiền nhỏ tuy nhiên ...

Tôi thấy rằng chuyển đổi nhiều INSERT INTO ...câu lệnh thành một câu lệnh lớn với nhiều VALUES(...), (...)tốc độ được cải thiện đáng kể.

Tôi đang sử dụng mysqlqua SSL qua mạng WAN. Cơ sở dữ liệu MySQL từ xa được lưu trữ trên Amazon.

Với 9 cột và 2.100 hàng:

  • 2.100 INSERTtuyên bố riêng biệt : 82s
  • 2 INSERTbáo cáo tổng hợp : <1s

Với 7 cột và 42.000 hàng:

  • 42.000 INSERTbáo cáo riêng biệt : 1.740s
  • 42 INSERTtuyên bố hợp nhất : 105s

Vì vậy, tùy thuộc vào công cụ tạo kết xuất cơ sở dữ liệu (hay cụ thể hơn là định dạng của INSERT câu lệnh), tốc độ có thể bị ảnh hưởng.

Lưu ý: Điều này cũng làm giảm .sqltệp kết xuất hơn 60% trong các thử nghiệm của tôi, vì vậy nó cũng sẽ tiết kiệm được i / o.

Cảnh báo: Có những hạn chế về mặt vật lý đối với kỹ thuật này vớimysql và đối với những người cần tính di động ... SQL Server dường như chỉ giới hạn ở 1.000 hàng mỗi lần.

Tuy nhiên, thực hiện 1.000 hàng tại một thời điểm cho 42.000 hàng vẫn mang lại sự cải thiện 1.657%!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.