2017-05-02 4 views
-1

In Mysql kann ich einen zusammengesetzten Primärschlüssel aus einem automatischen Inkrement und einem anderen Feld zusammengesetzt haben? Auch bitte Kritik meiner „MySQL-Partitionierung“ LogikPartition auf Composite-Key in ysql

Um zu erklären, Weiter->

ich eine Abfrage über MySQL-Partition. Ich muss eine Tabelle in MySQL partitionieren, es hat eine Primärschlüssel-ID. Ich muss nach Datum Feld (nicht-primäre, doppelte Einträge) partitionieren. Da wir nicht auf doppelte Einträge partitionieren können, habe ich einen zusammengesetzten Schlüssel erstellt -> (ID, Datum). Wie kann ich Partition in diesem zusammengesetzten Schlüssel erstellen?

Vielen Dank im Voraus ...

Antwort

0

(Diese Antwort geht davon aus InnoDB, nicht MyISAM. Es gibt Unterschiede bei der Umsetzung von Indizes, die einige meiner Kommentare falsch für MyISAM machen.)

In MySQL ein Tabelle PRIMARY KEY kann aus mehreren Feldern bestehen, einschließlich einer AUTO_INCREMENT.

Die einzige Anforderung in MySQL für AUTO_INCREMENT ist, dass es die erste Spalte in einige Index sein. Lassen Sie uns an diesem Beispiel von Posts schauen, wo es viele Beiträge für jeden Benutzer sein kann:

PRIMARY KEY(user_id, post_id), 
INDEX(post_id) 

wo post_id ist AUTO_INCREMENT, aber man konnte durch user_id von „Clustering“ der Daten profitieren. Dieses Clustering wäre es effizienter machen Anfragen wie

zu tun
SELECT ... FROM Posts 
    WHERE user_id = 1234; 

Zurück zu Ihrer Frage ...

Der „Partition Schlüssel“ muss nicht eindeutig sein; Ich verstehe also nicht, dass Sie "nicht auf doppelte Einträge partitionieren können".

INDEX(id, date), wenn Sie auch PRIMARY KEY(id) haben, ist im Wesentlichen nutzlos. Wenn Sie nach ID suchen, erhalten Sie mit dem PRIMARY KEY(id) einen perfekten Zugang. Hinzufügen von date zu einem Index wird nicht helfen. Wenn man nach date, , aber nicht id sucht, ist (id, date) nutzlos, da nur der "linke" Teil eines zusammengesetzten Indexes verwendet werden kann.

Vielleicht führen Sie zu einer nicht partitionierten Tabelle mit

PRIMARY KEY(date, id), 
INDEX(id) 

Datumsbereiche effizienter zu machen? (Hinweis: Partitionierung wird nicht helfen.

)

Vielleicht werden Sie tun

SELECT ... WHERE x = 123 AND date BETWEEN ... 

In diesem Fall ist dies von Vorteil:

INDEX(x, date) 

Nur wenn Sie dies tun, können wir den Nutzen der Partitionierung zu diskutieren beginnen:

WHERE x BETWEEN ... 
    AND date BETWEEN ... 

Dies benötigt einen "zweidimensionalen" Index, der mit SPATIAL existiert.

Siehe my discussion of partitioning wo ich nur 4 Anwendungsfälle für die Partitionierung auflisten. Es enthält auch eine Diskussion über die Verwendung von Partitionierung für 2D.

Bottom Line: Sie müssen nicht Partitionierungs diskutieren, ohne ein klares Bild von dem, was abfragt könnte es helfen. Stellen Sie sie zur Verfügung; dann können wir weiter diskutieren.