2010-03-24 41 views
7

Vì các khóa ngoại không được hỗ trợ bởi các cơ sở dữ liệu mySQL được phân đoạn cho thời điểm này, tôi muốn nghe một số chuyên gia và con cho một ứng dụng đọc nặng sẽ xử lý khoảng 1-400 000 hàng mỗi bảng. Thật không may, tôi chưa có đủ kinh nghiệm trong lĩnh vực này để tự mình kết luận ...Phím nước ngoài và phân vùng

Cảm ơn rất nhiều!

Tài liệu tham khảo:

How to handle foreign key while partitioning

Partitioning mySQL tables that has foreign keys?

Trả lời

4

Vâng, nếu bạn cần phân vùng cho một bảng nhỏ như 400.000 hàng có được một cơ sở dữ liệu MySQL hơn. Nghiêm túc. Theo tiêu chuẩn hiện đại, bất kỳ bảng nào dưới 1.000.000 hàng thường có kích thước nhỏ gọn (thậm chí không nhỏ), trừ khi bạn cũng không có bất kỳ chỉ số nào vv. Và tiêu chuẩn hiện đại là khoảng 10 năm trong lĩnh vực này.

+0

Vâng, số tôi couldn không tìm thấy bất kỳ đề xuất cho dù để phân vùng hay không. Tôi cho rằng nó sẽ tạo ra sự khác biệt đáng chú ý cho các bảng nhỏ. – Industrial

+1

Không. Phân vùng cơ bản là khi bạn gặp phải vấn đề với việc có một bảng. Về lý thuyết, ví dụ vì bạn giữ doanh thu mỗi năm - việc xóa tất cả doanh thu trong một năm thực sự là công việc khó khăn, nhưng với phân vùng, bạn có thể chỉ cần thả bảng trong một năm. Những điều nhỏ làm cho không có ý nghĩa như thế. – TomTom

+0

Cảm ơn rất nhiều TomTom. Đánh giá cao câu trả lời của bạn. Việc xóa một phần làm việc với phân vùng là hiển nhiên, nhưng từ những gì tôi đã nghe trước đây, một bảng được phân đoạn luôn hoạt động tốt hơn một phân đoạn không được phân đoạn, ngay cả với các tập dữ liệu nhỏ hơn. Tôi không có ý tưởng về sự so sánh trong việc tăng hiệu năng với các khóa ngoại trên các phần. Có vẻ như một chủ đề với ít thông tin về. Có lẽ tôi sẽ phải đi xuống một cách khó khăn để tìm ra với điểm chuẩn và dữ liệu mẫu ... – Industrial

1

Vâng, phân vùng không phải là giải pháp tốt cho mô hình dữ liệu phức tạp. Nếu bạn chỉ có 2 đến 3 bảng tùy thuộc vào nhau, bạn có thể làm được nhưng nó không đẹp. Mỗi bảng phải có một cột xác định phân vùng. Sau đó, mỗi bảng phải có trình kích hoạt để tạo bảng mới, đặt khóa ngoại và ràng buộc duy nhất.

Ví dụ, audittransaction < - auditentry

Mỗi audittransactionhas từ 0 đến n auditentry. bảng kiểm toán có chứa khóa ngoại giao dịch. Cả hai bảng phải có cột creationDate vì nó được sử dụng để phân vùng cả hai bảng.

------ tạo ra một kích hoạt để chèn audittransaction trong vòng cò

create or replace function audittransaction_insert_function() 
returns trigger as $$ 
DECLARE 

    tablepartition varchar; 
    tablename varchar; 
    startbounds timestamp; 
    endbounds timestamp;     


BEGIN 
    tablepartition := to_char(date_trunc('month', NEW.whendone), 'YYYYMMDD'); 
    tablename := 'audittransaction_' || tablepartition ;   

    if not exists(select * from information_schema.tables where table_name = tablename) then 
     startbounds := date_trunc('month', NEW.whendone); 
     endbounds := startbounds + cast('1 months' as interval); 
     execute 'create table ' || tablename || ' (CHECK (whendone >= ' || quote_literal(startbounds) || ' and whendone < ' || quote_literal(endbounds)|| ')) inherits (audittransaction)'; 
     execute 'ALTER TABLE '|| tablename ||' ADD CONSTRAINT '||tablename||'_unique_id UNIQUE (id)';   
    end if;  
    execute 'insert into ' || tablename || ' (id, operationid, whendone, "comment", ticketid ,transactionid, userid) values (' || quote_literal(NEW.id) || ',' || quote_literal(NEW.operationid) || ',' || quote_literal(NEW.whendone) || ')';     
    return null; 
END; $$ 
LANGUAGE plpgsql; 

create trigger insert_audittrans 

----- sau đó, tạo ra một kích hoạt cho autientry

create or replace function auditentry_insert_function() 
returns trigger as $$ 
DECLARE 
    tablepartition varchar; 
    tablename varchar; 
    startbounds timestamp; 
    endbounds timestamp;     


BEGIN 
    tablepartition := to_char(date_trunc('month', NEW.transactiontimestampgmt), 'YYYYMMDD'); 
    tablename := 'auditentry_' || tablepartition ; 

    if not exists(select * from information_schema.tables where table_name = tablename) then 
     startbounds := date_trunc('month', NEW.transactiontimestampgmt); 
     endbounds := startbounds + cast('1 months' as interval); 
     execute 'create table ' || tablename || ' (CHECK (transactiontimestampgmt >= ' || quote_literal(startbounds) || ' and transactiontimestampgmt < ' || quote_literal(endbounds)|| ')) inherits (auditentry)'; 
     execute 'ALTER TABLE '|| tablename ||' ADD CONSTRAINT '||tablename||'_unique_id UNIQUE (id)'; 
     execute 'ALTER TABLE ' || tablename ||' ADD CONSTRAINT auditentry FOREIGN KEY (audit_transaction_id) REFERENCES audittransaction_'||tablepartition ||'(id)';     
    end if;  
    execute 'insert into ' || tablename || ' (id, audit_transaction_id, eventid, transactiontimestampgmt,timestampgmt, acknowledged, resolved, acknowledgedbyusername, acknowledgeddate, notificationlevel, resolvedbyusername, resolveddate, severity, parentauditentry_id) values (' || quote_literal(NEW.id) || ',' || quote_literal(NEW.audit_transaction_id) || ',' || quote_literal(NEW.eventid) || ','||quote_literal(NEW.transactiontimestampgmt)||')';    
    return null; 
END; $$ 
LANGUAGE plpgsql; 

create trigger insert_auditentry before insert on auditentry for each row execute procedure auditentry_insert_function(); 
Các vấn đề liên quan