Xử lý một bảng lớn trong mysql


7

Tôi có một bảng thực sự lớn (khoảng> 100.000.000 hàng và kích thước> 50 GB) và nó đang bị giết hiệu suất lớn ngay bây giờ. Bên dưới khóa chính (id), nó sử dụng khóa fulltext trên trường varchar (500) để sử dụng tùy chọn tìm kiếm fulltext mysql.

Tuy nhiên, việc lưu và nhận hàng vào bảng này đang trở nên rất chậm ngay bây giờ .. Làm thế nào tôi có thể xử lý việc này? Đây là vấn đề đầu tiên của tôi. Vấn đề thứ hai của tôi là, việc sao lưu bằng mysqldump của bảng này là không sử dụng được, bởi vì sẽ mất vài tháng để nhập lại. Vấn đề thứ ba là, bảng này sử dụng công cụ MYISAM và việc chuyển đổi sang INNODB cũng không thể thực hiện được (tôi đã thử nghiệm và hủy bỏ lệnh xử lý sau 72 giờ).

Vì vậy, điều gì sẽ là một cách tiếp cận bằng chứng trong tương lai tốt để tăng tốc bảng này, sao lưu chính xác và có thể chuyển đổi nó thành INNODB? (INNODB nên chấp nhận FULLTEXT với phiên bản mysql của tôi)

Câu trả lời:


4

Tôi muốn đề xuất một cách tiếp cận triệt để hơn. Đối với cơ sở dữ liệu có kích thước của bạn, tìm kiếm toàn văn không chỉ không hiệu quả mà còn không hiệu quả. Tôi đoán rằng có một số loại chức năng tìm kiếm do người dùng điều khiển yêu cầu chỉ mục của bạn.

Làm thế nào về bạn sử dụng một công cụ tìm kiếm thực sự? Điều này sẽ giảm tải việc tạo khóa và sắp xếp lại cơ sở dữ liệu của bạn. Nó sẽ cho bạn cơ hội giảm tải cho cả một máy khác.

Hãy xem Apache Solr , một triển khai nhanh, được đón nhận dựa trên Lucene . Nhiều trang web phi lợi nhuận và thương mại lớn sử dụng nó thành công.

Sau đó, xóa chỉ mục fulltext khỏi bảng của bạn. Các phần chèn sau đó sẽ bay vào bảng chỉ còn lại khóa ID.

Ngoài ra, nếu bạn thường xuyên xóa các hàng khỏi bảng, thì TỐI ƯU HÓA nên được thực hiện thường xuyên.

Đối với mục đích sao lưu, bạn có thể xem xét nhân rộng . Có nhiều cách để thực hiện sao chép và tất cả chúng đều trải đều tải theo thời gian, thay vì tạo ra thời gian chết cho nó, đó là những gì bạn có bây giờ. Là một lợi ích bổ sung, một số bản sao có thể tạo ra một cơ sở dữ liệu có thể được sử dụng như một sự thay thế dự phòng nếu cơ sở dữ liệu chính bị lỗi, do đó ứng dụng có thể được cập nhật lại trong ít thời gian.


Tôi cảm thấy như Tìm kiếm đàn hồi dễ thực hiện hơn Solr (cuối cùng vẫn là lucene). Ngoài ra, còn có các dịch vụ dựa trên đám mây như searchify.com để giảm tải tài liệu của bạn đang tìm kiếm (nếu bạn không coi đám mây là một từ có bốn chữ cái)
atxdba

1

Đây không phải là một câu hỏi đơn giản và sẽ mất nhiều nỗ lực hơn để trả lời.

Để bắt đầu, xin vui lòng gửi lược đồ bảng của bạn, để mọi người có thể xem xét kỹ hơn.

Một số lời khuyên chung:

Hiệu suất

Để tìm hiểu những gì đang ăn hiệu suất của bạn, hãy thử lược tả các tuyên bố của bạn là INSERTing và SELECTing hàng.

Thí dụ:

  1. Bật trình hồ sơ:

    THIẾT LẬP hồ sơ = 1;

  2. Thực hiện INSERThoặc SELECTtuyên bố của bạn .

  3. Xem kết quả hồ sơ:

    HIỂN THỊ HỒ SƠ;

Điều này sẽ trả lại một cái gì đó như thế này:

Query_ID |  Duration | Query
---------+-----------+-----------------------
  ...    | ...       | ...   
   29    | 0.0006200 | SHOW STATUS
   30    | 0.3600000 | (your query here)
  ...    | ...       | ...

Trong ví dụ này, hiển thị chi tiết cho Query_ID 30:

SHOW PROFILE FOR QUERY 30; 

... Và bạn sẽ thấy phần chậm của tuyên bố này là gì. Tùy thuộc vào lý do bạn có thể thực hiện các biện pháp để tối ưu hóa hành vi, ngay cả khi nó liên quan đến những thứ đơn giản liên quan đến phần cứng như đĩa cứng nhanh hơn, v.v.

Sao lưu

Với các bảng lớn như thế này, các bản sao lưu thông thường như mysqldumpchỉ mất rất nhiều thời gian. Bạn có thể muốn xem xét các chiến lược sao lưu khác nhau. Nếu bạn đang sử dụng MyISAM, có thể nhanh hơn bằng cách sử dụng sao lưu dựa trên tệp sang một phân vùng khác, sau đó di chuyển các tệp sang bản sao lưu dự phòng của bạn. Bạn cũng có thể muốn tìm kiếm các lựa chọn thay thế chuyên nghiệp, pe Percona XtraBackup hoặc các công cụ tương tự.

Một cách tiếp cận khác là thiết lập sao chép .

InnoDB

Kể từ MySQL 5.6, bạn cũng có thể sử dụng fulltext trên InnoDB. Nó hứa hẹn tăng hiệu suất đáng kể, mà tôi đã không thử cho đến nay. Xin lưu ý, điều này ảnh hưởng đến hệ thống của bạn theo nhiều cách hơn:


0

Nếu bảng của bạn chủ yếu được sử dụng trong các hành động VIẾT (XÁC NHẬN / CẬP NHẬT), bạn nên sử dụng MyISAM.

Nếu bảng của bạn chủ yếu được sử dụng trong các hành động ĐỌC (CHỌN), bạn nên sử dụng InnoDB.

Tuy nhiên, bạn nên xem xét việc dọn phòng và thêm chỉ mục thích hợp vào các cột.


Tôi đang sử dụng MyISAM ngay bây giờ và tuy nhiên việc viết lên bàn mất quá nhiều thời gian ...

Tôi biết. Hãy thử quản lý dữ liệu. (ps cũng đăng lược đồ của bạn)
Raptor

Lược đồ là latin1_swbur_ci. Vậy SỬA CHỮA và TỐI ƯU nên làm gì? Tôi sẽ cố gắng làm điều đó. Có nhiều thủ thuật để tối ưu hóa tốc độ?

1
Lưu trữ dữ liệu cũ nếu không được sử dụng.
Raptor

0

Bạn có cần tất cả dữ liệu trong bảng này không, hoặc bạn có thể lọc một số dữ liệu không?

Nếu bạn cần truy cập vào tất cả dữ liệu, bạn có thể tách nó thành một bộ "nóng" mà bạn cần truy cập thường xuyên và một bộ "lạnh" mà bạn cần truy cập một lần không?

Những loại truy vấn bạn đang chạy? Bạn có thể tóm tắt một số dữ liệu trong một bảng khác để truy vấn không? Ví dụ: nếu bạn đang đếm số lượng trường, bạn có thể lưu trữ / cập nhật số đếm trong một bảng khác.

Hãy cho chúng tôi biết thêm.

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.