2013-05-13 32 views
8

Tôi đang làm việc trên một chương trình quản lý dự án, được xây dựng trên một LAMP stack. Tôi đã quyết định chọn không cung cấp cho mỗi khách hàng của tôi một cơ sở dữ liệu riêng của họ, mà là kết hợp tất cả dữ liệu của doanh nghiệp vào một cơ sở dữ liệu lớn.MySQL - Cách đo lượng không gian được một số hàng nhất định sử dụng?

Cột đầu tiên trong tất cả các bảng cơ sở dữ liệu là business_id. Hàng này cho biết doanh nghiệp nào có một phần dữ liệu nhất định, giúp chúng tôi không hiển thị dữ liệu của Doanh nghiệp 1 cho Doanh nghiệp 2.

Nhưng khi tôi cố gắng giải quyết các liên kết thanh toán, sẽ rất hữu ích để có thể chạy một công việc cron mỗi tháng một lần để xác định bao nhiêu không gian cơ sở dữ liệu mà mỗi doanh nghiệp đang sử dụng. Vì vậy, đây là câu hỏi của tôi: Có cách nào để có được MySQL để trả về số byte được sử dụng bởi tất cả các hàng WHERE business_id = 'x'?

+3

không thực sự, nhưng bạn có thể hình dung nó ra cho mình bằng cách thủ công kiểm đếm các loại lĩnh vực + kích thước cơ bản của những lĩnh vực mình: http://dev.mysql.com/doc/ refman/5.0/en/storage-requirements.html –

+2

Ngoài ra, bạn cũng có thể sử dụng một bảng cho mỗi doanh nghiệp, sau đó bạn có thể thấy kích thước tệp của bảng trong hệ thống tệp. –

+0

có cột 'AVG_ROW_LENGTH' trong' INFORMATION_SCHEMA.TABLES', nhưng điều đó sẽ chỉ cung cấp cho bạn ... avarage. – wroniasty

Trả lời

2

Vì bạn có thể sẽ chỉ thanh toán cho thông tin mà khách hàng rõ ràng trả tiền cho bạn để lưu trữ, chỉ cần tổng hợp độ dài của các trường mà họ cung cấp cho bạn một cách rõ ràng. (Bỏ các trường bên trong như business_id, service_level_id, permissions hoặc bất kỳ thứ gì.) Sau đó, hãy tham khảo storage requirements và tính toán.

Vì vậy, trong đó B là số byte cần thiết cho tất cả các lĩnh vực số, và có 3 văn bản các lĩnh vực txtA, txtB, và txtC, ví dụ:

select 
    business_id, 
    count(*) * B + 
     sum(length(txtA) + length(txtB) + length(txtC)) as bytes 
from table 
where business_id={id}; 

Nhưng, một khi bạn đã có một lượng dữ liệu hợp lý trong hệ thống của bạn, tôi nghi ngờ rằng truy vấn sẽ khá dài. Nó có thể đơn giản hơn để chỉ cho khách hàng của bạn biết bạn sẽ thanh toán cho họ trên lưu trữ dữ liệu "gần đúng" của họ. Sử dụng average_row_length * count(*) các hàng của chúng và cắt bớt một chút để tính phí cho chi phí của bạn.

+0

đưa bạn một giờ để chỉ sao chép câu trả lời của tôi? – Drew

+0

@DrewPierce A) Tôi chỉ thấy câu trả lời của bạn khoảng 1/2 giờ trước và tôi đã đi ăn trưa. B) Câu trả lời của bạn sai. Của tôi không phải là. – svidgen

+0

bạn tính tổng chiều dài giống như tôi. cho thấy một sqlfiddle vì vậy chúng tôi có thể phê bình nó quá. và sau đó cuối cùng u nói không sử dụng nó nhưng avg_row – Drew

0

Hope this helps:

SELECT 
    table_schema, count(*) TABLES, 
    concat(round(sum(table_rows)/1000000,2),'M') 
    rows,concat(round(sum(data_length)/(1024*1024*1024),2),'G') 
    DATA,concat(round(sum(index_length)/(1024*1024*1024),2),'G') 
    idx,concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') 
    total_size,round(sum(index_length)/sum(data_length),2) idxfrac 
FROM 
    information_schema.TABLES group by table_schema; 
Các vấn đề liên quan