Hiệu suất cao của MySQL cho rất nhiều CHỌN / CHERTN / CẬP NHẬT / XÓA


9

Tôi đang tạo một mô-đun nơi mọi người dùng thường nhận được một bản ghi vào bảng trong 10 đến 300 giây.

Khi hết thời gian, một bản ghi sẽ bị xóa. Trường hợp là: sẽ có rất nhiều người dùng và hồ sơ sẽ thay đổi thực sự thường xuyên - điều này sẽ ảnh hưởng đến hiệu suất của ứng dụng cho bảng này như thế nào, bởi vì các bản ghi sẽ thay đổi thực sự thường xuyên và tôi tự hỏi liệu mysql có ổn với điều đó không? Giống như các chỉ mục sẽ đến và đi, dữ liệu thay đổi như 200 lần / giây cho bảng cụ thể này. Có lẽ tôi đang chọn một giải pháp tồi cho loại công việc này. Bất kỳ đề xuất ?

Cảm ơn bạn!


2
Bạn đã thử lưu trữ dữ liệu trong memcache và sau đó xóa nó trong một giao dịch cứ sau vài giây?

3
"Dữ liệu thay đổi như 200 lần / giây cho bảng cụ thể này" Tôi nghĩ rằng dòng đó đánh vần dữ liệu này nên được giữ trong bộ nhớ, thời gian tồn tại của nó là rất nhỏ nên có lẽ không nên vào đĩa?

Chỉ số đến rồi đi? Tôi không thể nghĩ ra bất kỳ lý do nào khiến bạn cần tạo và xóa chỉ mục rất thường xuyên.
Barry Brown

Câu trả lời:


3

Một điều cần phải xem xét là cách MySQL sử dụng bộ đệm cho các công cụ lưu trữ chính của nó: InnoDBMyISAM .

Những gì nằm trong bộ nhớ cache khác nhau rất nhiều giữa các công cụ lưu trữ.

InnoDB lưu trữ cả trang dữ liệu và chỉ mục. Chúng được tải vào Nhóm đệm InnoDB, có kích thước bằng innodb_buffer_pool_size .

MyISAM chỉ lưu trữ các trang chỉ mục và chúng được tải vào Bộ đệm chính (Bộ đệm chính), có kích thước bằng key_buffer_size .

Bạn phải sử dụng information_schema.tables để lấy dữ liệu và kích thước chỉ mục chiếm trên đĩa để định kích thước chính xác cho Bộ đệm InnoDB và Bộ đệm chính MyISAM .

Tùy thuộc vào lượng dữ liệu bạn có và thời gian bạn cho phép, bạn có thể làm ấm bộ đệm như sau:

Đối với mỗi bảng TableT

  • goto đến từng chỉ số NDX
  • cho mỗi chỉ số NDX
    • chạy CHỌN mỗi cột trong NDX, ít nhất một cột không được lập chỉ mục trong TableT từ TableT

Bằng cách này, bạn đảm bảo rằng mọi trang dữ liệu và chỉ mục sẽ được đọc ít nhất một lần. Họ sẽ ngồi trong bộ nhớ cache. Khái niệm này được thực hành, một phần và về nguyên tắc, bởi Percona . Percona đã xây dựng khái niệm này thành mk-nô lệ-prefetch . Chương trình này làm gì

  • đọc nhật ký chuyển tiếp trên một nô lệ trước nô lệ xử lý SQL trong đó
  • lấy một câu lệnh SQL từ nhật ký chuyển tiếp và chuyển đổi nó thành một CHỌN sử dụng các mệnh đề WHERE, GROUP BY và ORDER BY như một hướng dẫn để chọn các chỉ mục
  • thực hiện câu lệnh SELECT xuất phát từ SQL được chuyển đổi

Điều này buộc nô lệ phải có 99,99% dữ liệu mà nô lệ cần để xử lý SQL nhanh chóng. Điều này cũng làm cho nô lệ được chuẩn bị trong trường hợp bạn chuyển đổi thủ công sang nô lệ và thăng cấp nó thành chủ nhân KHI CACHES CHỈ LÀ VỀ CÙNG NHƯ LÀ MASTER BẠN ĐÃ TỪNG TỪ.

PHẦN KẾT LUẬN

Không có gì có thể có bộ nhớ cache sẵn sàng, sẵn sàng và có thể cho bạn sử dụng trong một môi trường nặng nề, CẬP NHẬT và XÓA.

Hãy thử một lần !!!

CAUPAT

Với sự ra đời của các sản phẩm như memcached, một số người đã thoát khỏi nhu cầu thực hiện điều chỉnh đúng cách của MySQL. Cấp, nhiều trang web được hưởng lợi từ việc tăng cường truy xuất dữ liệu được cung cấp bằng cách kiểm soát hành vi bộ đệm của dữ liệu khi các nhà phát triển đã nhanh chóng nhìn thấy với memcached. Nhiều trang web khác, chỉ bằng cách chuyển đổi các công cụ lưu trữ hoặc cấu hình chính xác MySQL, đã nhận ra những lợi ích hiệu suất tương tự. Trước khi từ bỏ cơ sở dữ liệu và sử dụng nghiêm ngặt nó làm kho lưu trữ, hãy tận dụng tối đa cơ sở dữ liệu của bạn. Theo dõi sự chuyên cần và bạn có thể ngạc nhiên về những gì MySQL sẽ làm cho bạn.


5

Nếu đó là một giải pháp tồi tệ sẽ phụ thuộc vào nhiều thứ. Liệu dữ liệu này cần phải được kiên trì? Nếu không, có lẽ một giải pháp chỉ đơn giản là giữ dữ liệu này trong bộ nhớ sẽ hoạt động tốt hơn.

"Rất nhiều người dùng" không thực sự giúp được ai. MySQL rất có thể sẽ ổn nếu "rất nhiều" có nghĩa là vài trăm. (Mặc dù tùy thuộc vào những gì khác mà cơ sở dữ liệu của bạn phải xử lý. Hàng ngàn khả năng cũng sẽ hoạt động.)

Rốt cuộc, điều đó không quan trọng lắm, nếu bạn viết những hồ sơ đó để ở lại hoặc xóa chúng sau vài giây đến vài phút. Xóa chỉ làm cho hai hoạt động trong một. Và MySQL chắc chắn có thể xử lý một lượng rất lớn việc tạo và xóa các bản ghi. Hãy chắc chắn rằng bạn sử dụng một chỉ mục đơn giản để tìm lại những hồ sơ đó để xóa.

Nhưng không có con số thực tế và một số thông tin về phần cứng mà máy chủ cơ sở dữ liệu của bạn sử dụng, điều đó không thể được trả lời với độ chính xác cao.

Điều tốt nhất là viết một số ứng dụng nhỏ, đơn giản là mô phỏng lượng tải bạn nghĩ bạn sẽ nhận được mà không cần xử lý thực sự, chỉ cần bỏ nhiều bản ghi vào máy chủ, xóa chúng, với tốc độ chạy một số truy vấn như phần còn lại của chương trình của bạn sẽ tạo ra. Hãy nhìn vào máy chủ của bạn và xem, nếu điều đó ảnh hưởng đến nó theo bất kỳ cách nào.

Không chắc chắn, nhưng có các tùy chọn để thiết lập cho MySQL sẽ cho phép nó lưu toàn bộ bảng trong bộ nhớ. Dù sao thì điều này cũng xảy ra trong nhiều tình huống và rất có thể bạn sẽ không phải thay đổi nhiều. Nhưng nếu bạn nói về một lượng người dùng và hồ sơ thực sự rất lớn, bạn có thể điều chỉnh một vài thông số để tối ưu hóa bộ nhớ đệm cho các nhu cầu đặc biệt của mình.


4
+1 để đề xuất giải pháp giữ dữ liệu trong bộ nhớ.

3

Đây là một ý tưởng điên rồ . Nó liên quan đến các giả định và không phải lúc nào cũng được đề xuất thực hành (như cập nhật khóa) - Tôi sẽ nhận được rất nhiều tiêu cực khi đề xuất điều này nhưng ở đây nó ...

Giả sử rằng bạn có một khối lượng hàng rất lớn và khối lượng xóa lớn, bạn có thể nâng cao hiệu suất xóa bằng cách tạo 2 phân vùng trên bảng của mình. Các phân vùng sẽ khác nhau bởi chữ số đầu tiên của khóa. Thí dụ:

Giá trị khóa 1123234441 dành cho các hàng đang hoạt động và giá trị khóa: 9123234441 dành cho các hàng không hoạt động (chữ số đầu tiên trong ví dụ này được sử dụng như sau: 1 = active, 9 = không hoạt động).

Bây giờ khi người dùng xóa một hàng, bạn không xóa hàng một cách vật lý, bạn cập nhật khóa (Ouch!), Điều này sẽ tự động di chuyển hàng sang phân vùng hàng không hoạt động.

Tất nhiên, bạn cần hạn chế lựa chọn của mình để chỉ đọc dữ liệu từ phân vùng hoạt động. Bây giờ phần thú vị là việc bỏ phân vùng hàng không hoạt động là cực kỳ nhanh chóng.

Như tôi đã nói trước đó, điều này hoạt động nếu bạn chỉ có 1 bảng. Tôi chưa thử nghiệm điều này, vì vậy đây chỉ là một cách tiếp cận lý thuyết nhưng tôi đã trải nghiệm tốc độ giảm phân vùng và nó nhanh đến mức đáng kinh ngạc.

Để nâng cao lựa chọn của bạn, hãy sử dụng lập chỉ mục phù hợp và để tăng cường chèn giảm thiểu kích thước hàng và số lượng chỉ mục (tuyên bố này rất chung chung ...)

Để tham khảo, xem: http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html Hy vọng điều này sẽ giúp.


2
Tôi không chắc chắn, nếu điều này có ý nghĩa đối với vấn đề cụ thể này (Tôi đoán vẫn vậy, mysql sẽ lưu trữ toàn bộ nội dung và rất có thể những bản ghi đó sẽ không nhìn thấy đĩa bao giờ). Nhưng +1 để chỉ ra một kỹ thuật tối ưu hóa thú vị mà bây giờ tôi không biết.
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.