2012-08-01 7 views
7

Abbiamo una semplice tabella di prodotti. Ogni prodb ha il suo ID e categoria unici. Gli utenti spesso cercano per categoria, quindi voglio dividere i prodotti per categoria. Ogni categoria in una partizione, ad es.Come suddividere la tabella MySQL per colonna che non è nell'indice univoco

Come faccio? Perché ovviamente ho una chiave primaria nella mia colonna ID e ho bisogno del mio ID univoco. Non unico in ogni categoria.

Tuttavia partitiong ha questa limitazione che "ogni chiave univoca sul tavolo deve utilizzare ogni colonna espressione di partizionamento della tabella".

Bene, questo non rende il partizionamento un po 'inutile? O mi sta sfuggendo qualcosa? Cosa dovrei fare?

http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

risposta

10

Il trucco è quello di aggiungere il campo category alla chiave primaria corrente. (La tua chiave primaria rimarrà una chiave primaria)
Quindi puoi partizionare la tabella per categoria.

Ecco il codice è possibile utilizzare:

ALTER TABLE `products` DROP PRIMARY KEY , ADD PRIMARY KEY (`id` , `category`); 
ALTER TABLE `products` PARTITION BY KEY(category) PARTITIONS 6; 

Aggiungi auto_increment opzione per l'id, se si vuole che sia davvero unico, e non si specifica il valore di id quando si inseriscono dati nella tabella. L'ID verrà determinato dal server di database al momento dell'inserimento.

Modificare i nomi dei campi e i nomi delle chiavi se necessario.

Documentazione:
Partitioning types
KEY Partioning

+0

Certo, ma id saranno quindi non essere unico, ma è solamente unico in categoria, che io non voglio. Sostituisci In smetterà di funzionare allora. Nel caso in cui la categoria di prodotto cambierà, il prodotto verrebbe duplicato. Ma comunque, grazie per la tua risposta. –

+0

No. L'aggiunta di un campo a una chiave primaria non può renderla non unificata, come ho scritto nella mia risposta. Perché non provi e vedi che funziona? Ho usato quel partizionamento su una grande tabella di log (tra 2 e 5 milioni di record) per partizionare di giorno: permette molto velocemente 'SELECT' di giorno, e cancellazione estremamente veloce di tutti i record per un giorno particolare (semplicemente lasciando cadere una partizione). – Jocelyn

+0

Oh no, so che PRIMARY KEY sarà ancora unico. Ma l'ID che ora sarà solo parte della chiave smetterà di essere univoco in quanto un valore diverso nella colonna della categoria può rendere la chiave univoca anche se l'ID sarà lo stesso. Ma sembra che MySQL funzioni in quel modo (anche se non ha molto senso) e dovrò conviverci. Comunque, grazie per il tuo impegno. –