2010-03-22 12 views
5

Was wäre ein geeigneter Weg, dies zu tun, da mySQL dies offensichtlich nicht genießt. Die Partitionierung oder die Fremdschlüssel aus dem Datenbankentwurf heraus zu lassen, scheint mir keine gute Idee zu sein. Ich nehme an, dass es einen Workaround dafür gibt?Partitionieren von mySQL-Tabellen mit Fremdschlüsseln?

-Update 24.03:

http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html

How to handle foreign key while partitioning

Dank!

+0

Bounty ist eingeschaltet! Mal sehen, ob wir diese Frage wieder lebendig bekommen können! – Industrial

Antwort

2

Es hängt davon ab, inwieweit die Größe der Zeilen in der partitionierten Tabelle der Grund für die Notwendigkeit von Partitionen ist.

Wenn die Zeilengröße ist klein und der Grund für die Partitionierung ist die bloße Nummer Zeilen, dann bin ich mir nicht sicher, was Sie tun sollten.

Wenn die Zeilengröße recht groß ist, dann haben Sie darüber nachgedacht, wie folgt vor:

Let P die partitionierten Tabelle und F die Tabelle in der angehenden Fremdschlüssel referenziert werden. Erstellen Sie eine neue Tabelle X:

CREATE TABLE `X` (
    `P_id` INT UNSIGNED NOT NULL, 
     -- I'm assuming an INT is adequate, but perhaps 
     -- you will actually require a BIGINT 
    `F_id` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`P_id`, `F_id`), 
    CONSTRAINT `Constr_X_P_fk` 
     FOREIGN KEY `P_fk` (`P_id`) REFERENCES `P`.`id` 
     ON DELETE CASCADE ON UPDATE RESTRICT, 
    CONSTRAINT `Constr_X_F_fk` 
     FOREIGN KEY `F_fk` (`F_id`) REFERENCES `F`.`id` 
     ON DELETE RESTRICT ON UPDATE RESTRICT 
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci 

und entscheidend, für das Hinzufügen von Zeilen Tabelle P eine gespeicherte Prozedur erstellen. Ihre gespeicherte Prozedur sollte sicherstellen (Transaktionen verwenden), dass beim Hinzufügen einer Zeile zur Tabelle P eine entsprechende Zeile zur Tabelle X hinzugefügt wird. Sie dürfen nicht zulassen, dass Zeilen auf "normale" Weise zu P hinzugefügt werden! Sie können nur garantieren, dass die referenzielle Integrität erhalten bleibt, wenn Sie Ihre gespeicherte Prozedur zum Hinzufügen von Zeilen verwenden. Sie können jedoch normal von P löschen.

Die Idee hier ist, dass Ihre Tabelle X genügend kleine Zeilen hat, die Sie hoffentlich nicht brauchen, um es zu partitionieren, obwohl es viele viele Zeilen hat. Der Index auf dem Tisch wird trotzdem einen ziemlich großen Speicherbedarf haben, denke ich.

Sollten Sie auf dem Fremdschlüssel P abfragen müssen, werden Sie natürlich X abfragen, da das der Fremdschlüssel ist.

+1

Ich habe gerade die MySQL-Handbuchseite zu Partitionsbeschränkungen gelesen und herausgefunden, dass du das nicht nur nicht haben kannst ein Fremdschlüssel in einer partitionierten Tabelle, Sie können auch keinen Fremdschlüssel * haben, der auf * eine partitionierte Tabelle zeigt. Das bedeutet, dass das obige nicht ganz gut genug ist. Sie können es beheben, indem Sie (offensichtlich) die Einschränkung "Constr_X_P_fk" entfernen und eine zweite gespeicherte Prozedur hinzufügen, deren Zweck das Löschen von Zeilen in "P" und "X" ist. Offensichtlich sollten Sie dann sicherstellen, dass alle Löschvorgänge mit der gespeicherten Prozedur ausgeführt werden, anstatt eine normale DELETE-Anweisung zu verwenden. – Hammerite

1

Ich würde stark sharding mit Datum als Schlüssel für die Archivierung von Daten in Archivtabellen vorschlagen. Wenn Sie mehrere Archivtabellen melden müssen, können Sie Ansichten verwenden oder die Logik in Ihrer Anwendung erstellen.

Mit einer ordnungsgemäß strukturierten Datenbank sollten Sie jedoch in der Lage sein, vor der Partitionierung mehrere zehn Millionen Zeilen in einer Tabelle zu verarbeiten, oder das Sharding wird wirklich benötigt.

+0

Hallo Gary. Schärfen ist definitiv ein interessanter Ansatz. Ich habe ein bisschen Angst davor, dass eine große Anzahl von JOINS in der Anwendungslogik benötigt wird. – Industrial

+0

Ich würde Foreign Keys in Ihrem Design lassen. Warum denkst du, dass du partitionieren musst? Wir haben Tabellen mit mehr als hundert Millionen Zeilen, die sich hervorragend verhalten. Shading ist meiner Meinung nach eine bessere Option als Partitionen. Die aktuelle Partition Implementierung in MySQL ist einfach zu einschränkend. – Gary

+0

In einer anderen Frage, sah ich, dass Sie erwähnt haben, dass Ihre Tabelle 400K Datensätze hat.Sie werden keinen Leistungsvorteil sehen, wenn Sie eine Tabelle von solch geringer Größe partitionieren, vorausgesetzt, dass sie ordnungsgemäß indiziert ist. – Gary

Verwandte Themen