Một bảng NHỚ sẽ chiếm bao nhiêu bộ nhớ?


7

Giả sử tôi có bảng MyISAM với chiều dài dữ liệu là 4,8 GB và chiều dài chỉ mục là 6,2 GB. Vì vậy, tổng kích thước dữ liệu của mười một gig. Tôi cần bao nhiêu bộ nhớ, tôi có thể chuyển đổi nó thành một MEMORYbảng không? 11 gig, hoặc nhiều hơn?


Xin lưu ý rằng các bảng NHỚ là tạm thời và tất cả dữ liệu sẽ bị mất khi tắt máy chủ. Nếu bạn có một bảng trở nên lớn như vậy, tôi sẽ đoán dữ liệu không phải là tạm thời.
db2

Trên thực tế, nó là - nó tập hợp dữ liệu từ một tá bảng, để các bảng khác (không nằm trong bộ nhớ) có thể lấy dữ liệu hợp nhất từ ​​nó. Đó là tạm thời, được tạo một lần một tuần và một khi các bảng đó nhận được dữ liệu của họ, nó có thể biến mất.
Andrew

Gotcha, sau đó là một cái nhìn cụ thể hóa. Chỉ đảm bảo.
db2

Không vấn đề gì. :) Đó là một mối quan tâm hợp lệ và tôi mong đợi ai đó sẽ thực hiện nó, vì vậy đó là lỗi của tôi khi đặt câu hỏi để bắt đầu.
Andrew

Bạn có thể gửi SHOW CREATE TABLEđầu ra trong câu hỏi của bạn?
Derek Downey

Câu trả lời:


7

Yêu cầu bộ nhớ chính xác của một hàng được tính từ công thức sau:

SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) × 4)
+ SUM_OVER_ALL_HASH_KEYS(sizeof(char*) × 2)
+ ALIGN(length_of_row+1, sizeof(char*)) 

[src]

ALIGN () đại diện cho hệ số làm tròn để làm cho độ dài hàng là bội số chính xác của kích thước con trỏ char. sizeof (char *) là 4 trên máy 32 bit và 8 trên máy 64 bit.

Vì vậy, trên máy 64 bit, thay thế sizeof(char*)bằng 8.

Bạn có thể lấy ước tính length_of_rowtừ Lược đồ thông tin:

SELECT TABLE_ROWS, AVG_ROW_LENGTH FROM information_schema.tables WHERE  table_schema='foo' AND table_name='bar';

Sau đó, bạn thêm tất cả các khóa BTREE và sau đó là các phím HASH. Lưu ý rằng việc chuyển đổi bất kỳ khóa nào sang HASH có thể là điều đáng làm, vì chúng cần ít bộ nhớ hơn.

Tôi sẽ đề cập đến giới hạn kích thước NHỚ tối đa phụ thuộc vào max_heap_table_size, nhưng gbn đã đánh bại tôi với nó.


1
câu trả lời hay, đặc biệt là về các chỉ số (+1 !!!). Xin chào Andrew, đây là một gợi ý cho bạn: Nếu các truy vấn của bạn thực hiện tìm kiếm trong phạm vi, hãy tránh xa các chỉ mục HASH và chỉ sử dụng BTREE. Nếu các truy vấn của bạn thực hiện tìm kiếm chỉ mục (eq numf), ngược lại.
RolandoMySQLDBA

4

@gbn@DTest đã cung cấp các câu trả lời tuyệt vời về việc sử dụng các bảng MEMOR về chỉ số và giới hạn kích thước.

Đây là một quan điểm khác cần ghi nhớ:

Công cụ lưu trữ BỘ NHỚ

  • sử dụng khóa bảng đầy đủ cho INSERT, UPDATE và DELETE
  • Không thể thực hiện INSERT đồng thời
  • sử dụng các chỉ mục băm thay vì các chỉ mục BTREE theo mặc định
  • có thể sử dụng các chỉ mục BTREE, nhưng phải được chỉ định rõ ràng tại thời điểm CREATE TABLE
  • không có hỗ trợ giao dịch
  • Các truy vấn hàng đơn chỉ tuyệt vời đối với các bảng NHỚ, đặc biệt là sử dụng các chỉ mục HASH
  • Các truy vấn khác nhau và truy cập tuần tự chỉ là khủng khiếp trừ khi bạn sử dụng BTREE một cách rõ ràng (cần nhiều bộ nhớ hơn)

Mặc dù bạn có dữ liệu trong RAM, mysqld sẽ luôn nhấn tệp .frm để kiểm tra bảng hiện có làm điểm tham chiếu, do đó luôn phát sinh một I / O đĩa nhỏ. Theo tỷ lệ, truy cập nhiều vào bảng công cụ lưu trữ MEMOR sẽ có I / O đĩa đáng chú ý.

Bạn cũng phải nhớ đạt được sự cân bằng hợp lý trong việc sử dụng bảng NHỚ với

  • Bộ nhớ cache cơ sở dữ liệu
    • Bộ nhớ cache MyISAM
    • Bể đệm InnoDB)
  • Bộ nhớ cache hệ điều hành
  • Hoạt động của hệ điều hành

3

Nó không thể là bảng NHỚ (trích dẫn chọn lọc bên dưới) nếu vượt quá "max_heap_table_size" . Đây là tối đa 4GB cho 32 bit

Kích thước tối đa của các bảng MEMORY bị giới hạn bởi biến hệ thống max_heap_table_size, có giá trị mặc định là 16MB. Để thực thi các giới hạn kích thước khác nhau cho các bảng NHỚ, hãy thay đổi giá trị của biến này

Bạn có thể đặt bảng này trên mỗi bảng bằng cách đặt max_heap_table_size mỗi phiên.

Nhưng 12GB hoặc nhiều hơn là rất nhiều bộ nhớ cho một bảng bộ đệm ...


1
Hey, câu trả lời tốt về giới hạn kích thước bảng NHỚ. +1 !!!
RolandoMySQLDBA

1
Tôi nghĩ bạn có nghĩa là tối đa có thể max_heap_table_size là 4 GB cho 32 bit (và 16 exabyte cho 64 bit).
Matthew Flaschen
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.