2012-08-01 4 views
7

Miejmy prosty zestaw produktów. Każdy produkt ma swój unikalny identyfikator i kategorię. Użytkownicy często wyszukują według kategorii, więc chcę podzielić produkty według kategorii. Każda kategoria w jednej partycji, np.Jak podzielić tabelę MySQL według kolumny, której nie ma w unikalnym indeksie?

Jak to zrobić? Ponieważ oczywiście mam klucz podstawowy w kolumnie ID i potrzebuję unikalnego identyfikatora. Niepowtarzalny w każdej kategorii.

Jednak partitiong ma to ograniczenie, że "każdy unikalny klucz w tabeli musi używać każdej kolumny w wyrażeniu partycjonowania tabeli".

Cóż, czy to nie sprawia, że ​​partycjonowanie jest bezużyteczne? Czy może czegoś brakuje? Co powinienem zrobić?

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

Odpowiedz

10

Sztuką jest dodanie pola category do bieżącego klucza podstawowego. (Twój klucz podstawowy pozostanie kluczem podstawowym)
Następnie możesz podzielić swój stół według kategorii.

Oto kod można użyć:

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

Dodaj auto_increment opcję id, jeśli ma to być naprawdę wyjątkowy, a nie określają wartość id podczas wstawiania danych w tabeli. Identyfikator zostanie określony przez serwer bazy danych po wstawieniu.

W razie potrzeby zmień nazwy pól i ich nazwy.

Dokumentacja:
Partitioning types
KEY Partioning

+0

Jasne, ale id nie będzie wówczas unikalny ale tylko unikatowe w kategorii, których nie chcę. Replace Into przestanie wtedy działać. W przypadku, gdy kategoria produktu ulegnie zmianie, produkt zostanie zduplikowany. Ale w każdym razie, dzięki za twoją odpowiedź. –

+0

Nie. Dodanie pola do klucza podstawowego nie może sprawić, że stanie się to non_unique, jak napisałem w mojej odpowiedzi. Dlaczego po prostu nie spróbujesz zobaczyć, że to działa? Użyłem tej partycji na dużej tabeli dziennika (od 2 do 5 milionów rekordów) do partycjonowania w ciągu dnia: pozwala bardzo szybko "SELECT" w ciągu dnia, i bardzo szybko usunąć wszystkie rekordy dla danego dnia (po prostu upuszczając partycję). – Jocelyn

+0

O nie, wiem, że KLAWISZ PRIMARY nadal będzie wyjątkowy. Ale identyfikator, który teraz będzie tylko częścią klucza, przestanie być unikalny, ponieważ inna wartość w kolumnie kategorii może spowodować, że klucz będzie unikalny, chociaż ID będzie taki sam. Wygląda jednak na to, że MySQL działa właśnie tak (choć nie ma to większego sensu) i będę musiał z tym żyć. W każdym razie, dzięki za twój wysiłek. –

Powiązane problemy