2013-03-14 13 views
15

Szukam porady na temat najlepszego sposobu przechowywania długich ciągów danych od ekspertów mySQL.MySQL najlepszy sposób przechowywania długich łańcuchów

Mam tabelę ogólnego przeznaczenia, która służy do przechowywania wszelkiego rodzaju danych, przez co mam na myśli, że powinna być w stanie przechowywać dane alfanumeryczne i numeryczne. Obecnie struktury tabeli jest proste z identyfikatorem i rzeczywistych danych przechowywanych w jednej kolumnie w sposób następujący:

id INT(11) 
data VARCHAR(128) 

teraz ma wymogu magazynowania większej ilości danych (do 500 znaków) i am Zastanawiam się, czy najlepszym sposobem byłoby po prostu zwiększenie rozmiaru kolumny varchar, czy też powinienem dodać nową kolumnę (kolumnę typu TEXT?) na czas potrzebny mi do przechowywania dłuższych łańcuchów.

Jeśli którykolwiek z ekspertów ma jakąkolwiek radę, to ja jestem uszy! Moja preferowana metoda to po prostu zwiększenie kolumny varchar, ale to dlatego, że jestem leniwy. Wersja MySQL, której używam, to 5.0.77.

Powinienem wspomnieć o nowym wymogu 500 znaków będzie tylko dla nieparzystych rekord; większość rekordów w tabeli nie będzie dłuższa niż 50 znaków. Myślałem, że będę odporny na przyszłość, tworząc kolumnę 128. Pokazuje ile wiedziałem!

+1

Użyj typu longtext. – Dhinakar

+0

Co chcesz osiągnąć? – sectus

+0

Czy naprawdę ważne jest, aby wiedzieć, co zamierzasz zrobić z tymi danymi, czy manipulujesz nim w zapytaniu, czy po prostu zapisujesz i odzyskujesz całą kwotę? – Steve

Odpowiedz

18

Ogólnie mówiąc, nie jest to pytanie, które ma "prawidłową" odpowiedź. W MySQL nie istnieje typ zapisu tekstu o "nieskończonej długości". Możesz użyć LONGTEXT, ale to wciąż ma (absurdalnie wysoki) górny limit. Jeśli jednak to zrobisz, kopiesz DBMS w zęby za to, że musisz poradzić sobie z tym absurdalnym kropelkiem kolumny dla 50-znakowego tekstu. Nie wspominając o tym, że prawie nic z tym nie robisz.

Tak więc większość przyszłych rozwiązań (TM) jest prawdopodobnie oferowana przez LONGTEXT. Ale jest to również bardzo zła metoda rozwiązania problemu. Szczerze mówiąc, chciałbym ponownie zapoznać się z wymaganiami aplikacji. Przechowywanie ciągów, które nie mają "domeny" (jak w, bycie dobrze zdefiniowanym w ich aplikacji) i arbitralnej długości, nie jest jedną z mocnych stron RDBMS.

Jeśli chciałbym rozwiązać ten problem na poziomie "projektu aplikacji", użyłbym do tego magazynu wartości klucz-wartość NoSQL (i mam taki sam anty-NoSQL-hype, jak to się dzieje, więc wiesz, że to jest poważne), chociaż uznaję, że jest to dość kosztowna zmiana w przypadku tak drobnych zmian. Ale jeśli to wskazuje na to, co twój DBMS ma zamiar utrzymać, to może być bardziej rozważne przejście teraz, aby uniknąć tego samego problemu setki razy w przyszłości. Domena danych jest bardzo ważna w RDBMS, podczas gdy jest wyraźnie odsunięta na bok w rozwiązaniach nierelacyjnych, co wydaje się być tym, co próbujesz rozwiązać tutaj.

Utknąłeś z MySQL? Po prostu zwiększ to do VARCHAR(1000). Jeśli nie masz żadnych wymagań co do swoich danych, nie ma znaczenia, co robisz.

+0

Wystarczy pamiętać, że jeśli jest to tylko 500 znaków, "TEKST" będzie działał dobrze. –

+1

"TEKST" jest zarówno ciężki do użycia dla "tylko" 500 znaków, a także OP nie wie, czy 500 jest górnym limitem.Odpowiedź zależy od tego, czy używasz MyISAM lub InnoDB, ale w przypadku kolumn, w których tekst jest szybko dostępny, "VARCHAR" jest szybszy, ponieważ przechowuje dane w linii (InnoDB przechowuje również tekst "TEKSTU" w linii do limitu długości wiersza, 2^16). Zależy więc od aplikacji, ale "TEKST" jest zawsze zawsze lepszy, jeśli nie można ustawić stabilnego górnego limitu długości kolumny. – Naltharial

+0

Uzgodnione, @Naltharial. Po prostu chciałem, aby sugestie "LONGTEXT" nie były jedynymi odniesieniami do "TEKSTU" tutaj - zamiast "LONGTEXT", "TEKST" będzie prawdopodobnie znacznie bardziej prawdopodobnym rozwiązaniem dla OP, chociaż prawdziwe rozwiązanie to mam nadzieję, że zaostrzenie wymagań. –

Powiązane problemy