Thêm một chỉ số rất chậm, có một cmd mysql để có được ETA hoặc hiển thị tiến trình không?


13

Tôi hiện đang chạy một truy vấn thay đổi trên bảng của mình (20 triệu mục) để thêm chỉ mục. nó đã chạy được hơn 3 ngày rồi (bị kẹt trên 'sao chép vào bảng tmp').

Có cách nào để tôi có thể thấy tiến trình của truy vấn hay nói cách khác là có cách nào để tôi có thể nhận được thời gian ước tính hoàn thành không?

cảm ơn.


4
MyISAM? InnoDB? Nếu InnoDB, tệp trên mỗi bảng có được bật không?
Charles

Câu hỏi tuyệt vời - điều tốt nhất tôi có thể nghĩ ngay lập tức là đoán sơ bộ bằng cách sử dụng kích thước của các tệp tạm thời và thực tế - sẽ thực hiện một số nghiên cứu nữa

Vui lòng SHOW CREATE TABLE tblname\Glên bàn và cho chúng tôi biết chỉ số bạn muốn thực hiện.
RolandoMySQLDBA

Câu trả lời:


3

Khi mysql thay đổi một bảng, về cơ bản nó sẽ tạo một bản sao của nó và sau đó hoán đổi bản sao. Cách này nếu bạn hủy bản cập nhật ở giữa, bảng vẫn ở trạng thái ổn định. Vì vậy, bạn có thể xem trong thư mục dữ liệu mysql (/ var / lib / mysql /?) Để xem tệp mới lớn đến mức nào, điều đó sẽ cho bạn biết nó đi được bao xa. Điều này hơi khó khăn hơn với Innodb, nhưng có một bảng tmp đang được tạo ở đâu đó.

Bạn có thể giảm đáng kể lượng thời gian mà chỉ mục mất bằng cách tăng các biến bộ đệm sắp xếp của bạn (myisam_sort_buffer_size, sort_buffer_size). Làm cho những cái đó lớn như bạn có thể với bộ nhớ bạn có. Bạn có thể cắt giảm một vài ngày trong thời gian sửa đổi, thậm chí giảm xuống còn vài giờ tùy thuộc vào dung lượng bộ nhớ của bạn. Tôi đã hoàn thành một bảng kỷ lục 150 triệu trong khoảng 3 giờ.


Thật không may, tôi không thể tìm thấy bất kỳ bảng tmp. Tôi sử dụng innoDB, với innodb_file_per_table được đặt thành TẮT.

2

Vì innodb_fle_per_table là OFF, bạn không thể xem bảng và đo lường tiến trình.

Tôi đã viết một bài trước đó về cách làm điều này cho MyISAM . Bạn có thể làm điều này cho InnoDB khi và chỉ khi innodb_file_per_table được bật và bạn tìm kiếm lại cơ sở hạ tầng InnoDB . Nó vẫn yêu cầu tìm kiếm trong hệ điều hành ở kích thước của các tệp được đề cập.

Khi bạn đã thực hiện đầy đủ InnoDB Cleanup và bạn đã bật innodb_file_per_table, bạn có thể muốn thực hiện cập nhật chỉ mục như sau:

VÍ DỤ bạn có những điều sau đây

  • Sơ đồ MySQL với / var / lib / mysql là datadir
  • Bảng InnoDB được gọi db.lotsofdatavới 20 triệu tên:

Bảng trông như thế này:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Giả sử bạn muốn tạo một chỉ mục tên. Bạn có thể làm được việc này:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Trong khi INSERT đang chạy, bạn vào hệ điều hành và chạy nó:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Điều này sẽ cung cấp cho bạn một danh sách kích thước hiện tại của lotsofdata_new.ibd. Khi nó lớn hơn lotsofdata.ibd, thì bạn biết bạn đã gần hoàn thành.

BTW MariaDB có Trạng thái tiến độ được triển khai trong nội bộ .


cảm ơn phản hồi của bạn bây giờ, tôi quyết định hủy truy vấn và thử lại sau khi nâng cấp lên phiên bản mysql cuối cùng. hy vọng nó sẽ đi trơn tru hơn theo cách đó.
Atai Voltaire

1

Không có cách nào đáng tin cậy để xem tiến trình tạo chỉ mục. Nếu bạn đã bật innodb-file-per-table, bạn có thể nhận được một số dấu hiệu bằng cách xem tệp .ibd tạm thời đang được tạo trong thư mục dữ liệu và so sánh với kích thước của tệp hiện tại, nhưng điều đó không phải là rất đáng tin cậy, vì tệp dữ liệu hiện tại của bạn có thể bị sai lệch do xóa / phân mảnh và tệp dữ liệu mới sẽ có một chỉ mục bổ sung mà tệp trước đó của bạn không có.

Có vẻ như bạn đang sử dụng phiên bản MySQL mà không cài đặt plugin InnoDB . Plugin InnoDB có khả năng tạo chỉ mục nhanh , không yêu cầu xây dựng lại hoàn toàn bảng để bổ sung và xóa chỉ mục. Plugin InnoDB được bật theo mặc định trong MySQL 5.5 và có sẵn với cài đặt cấu hình trong 5.1,38 trở lên.

  • Bạn đang sử dụng phiên bản nào của MySQL?

Percona Server quay lại khá nhiều cách (trước 5.5) có Plugin InnoDB được bật theo mặc định.


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.