Mam tabelę komunikatów w MySQL, która rejestruje wiadomości między użytkownikami. Oprócz typowych identyfikatorów i typów wiadomości (wszystkie typy całkowite) muszę zapisać rzeczywisty tekst wiadomości jako VARCHAR lub TEXT. Ustawiam limit frontonu na 3000 znaków, co oznacza, że wiadomości nigdy nie będą wstawiane do bazy danych tak długo.
Czy istnieje uzasadnienie dla korzystania z VARCHAR (3000) lub TEXT? W pisaniu VARCHAR (3000) jest coś, co wydaje się nieco sprzeczne z intuicją. Przejrzałem inne podobne posty na temat Przepełnienia stosu, ale dobrze byłoby uzyskać widoki specyficzne dla tego rodzaju przechowywania typowych wiadomości.
Odpowiedzi:
TEXT
iBLOB
może być przechowywany poza stołem, przy czym stół ma tylko wskaźnik do lokalizacji rzeczywistej pamięci. Miejsce przechowywania zależy od wielu rzeczy, takich jak rozmiar danych, rozmiar kolumn, format_wierszy i wersja MySQL.VARCHAR
jest przechowywany w jednej linii z tabelą.VARCHAR
jest szybszy, gdy rozmiar jest rozsądny, którego kompromis byłby szybszy, zależy od twoich danych i sprzętu, chciałbyś przetestować rzeczywisty scenariusz z twoimi danymi.źródło
varchar
iblob
/text
na InnoDB dla małych elementów tekstowych? Więc byłoby wtedy być mądry po prostu dołożyć wszelkichvarchar
dotext
rodzaju i niech DB zarządzać inline vs przepełnienia?Czy potrafisz przewidzieć, jak długo potrwa wkład użytkownika?
źródło
Aby wyjaśnić najlepsze praktyki:
Wiadomości w formacie tekstowym powinny prawie zawsze być przechowywane jako TEKST (kończą się dowolnie długimi)
Atrybuty ciągów powinny być przechowywane jako VARCHAR (docelowa nazwa użytkownika, temat itp.).
Rozumiem, że masz limit frontonu, który jest świetny, dopóki go nie ma. * grin * Sztuczka polega na tym, aby myśleć o DB jako oddzielnym od aplikacji, które się z nią łączą. To, że jedna aplikacja ogranicza dane, nie oznacza, że dane są wewnętrznie ograniczone.
Co takiego jest w samych wiadomościach, że zmusza je, aby nigdy nie miały więcej niż 3000 znaków? Jeśli jest to tylko arbitralne ograniczenie aplikacji (np. W przypadku pola tekstowego lub czegoś innego), użyj
TEXT
pola na warstwie danych.źródło
Oświadczenie: Nie jestem ekspertem od MySQL ... ale to moje rozumienie problemów.
Myślę, że TEKST jest przechowywany poza wierszem mysql, podczas gdy myślę, że VARCHAR jest przechowywany jako część tego wiersza. Istnieje maksymalna długość wiersza dla wierszy mysql .. więc możesz ograniczyć ilość innych danych, które możesz przechowywać w rzędzie, używając VARCHAR.
Również ze względu na to, że VARCHAR stanowi część wiersza, podejrzewam, że zapytania dotyczące tego pola będą nieco szybsze niż te, które używają fragmentu TEXT.
źródło
varchar
kolumna zawierająca 3000 znaków może zająć do 9000 bajtów.TEXT
wbudowane w tabeli.Krótka odpowiedź: brak praktycznej, wydajności lub przechowywania, różnica.
Długa odpowiedź:
Zasadniczo nie ma różnicy (w MySQL) między
VARCHAR(3000)
(lub innym dużym limitem) aTEXT
. Pierwszy z nich obetnie 3000 znaków ; ten ostatni zostanie obcięty przy 65535 bajtach . (I rozróżnia bajtów i znaków , ponieważ postać może wziąć kilka bajtów).Dla mniejszych limitów w
VARCHAR
istnieją pewne zaletyTEXT
.CHARACTER SET
.INDEXes
są ograniczone w tym, jak duża może być indeksowana kolumna. (767 lub 3072 bajtów ; jest to zależne od wersji i ustawień)SELECTs
są obsługiwane na dwa różne sposoby - MEMORY (szybciej) lub MyISAM (wolniej). Gdy w grę wchodzą „duże” kolumny, wolniejsza technika jest wybierana automatycznie. (Znaczące zmiany w wersji 8.0; więc ten punktor może ulec zmianie).TEXT
typy danych (w przeciwieństwie doVARCHAR
) przechodzą bezpośrednio do MyISAM. Oznacza to, żeTINYTEXT
automatycznie jest gorszy dla wygenerowanych tabel temperatur niż ich odpowiednikVARCHAR
. (Ale to prowadzi dyskusję w trzecim kierunku!)VARBINARY
jest jakVARCHAR
;BLOB
jest jakTEXT
.Obalenie innych odpowiedzi
Pierwotne pytanie zawierało jedno pytanie (jakiego typu danych użyć); zaakceptowana odpowiedź odpowiedziała na coś innego (zapisywanie poza rekordem). Ta odpowiedź jest już nieaktualna.
Kiedy ten wątek został uruchomiony i odpowiedział, w InnoDB istniały tylko dwa „formaty wierszy”. Niedługo potem dwa kolejne formaty (
DYNAMIC
iCOMPRESSED
).Miejsce przechowywania
TEXT
iVARCHAR()
zależy od rozmiaru , a nie od nazwy typu danych . Aby uzyskać zaktualizowaną dyskusję na temat przechowywania / zapisywania w trybie zapisu dużych kolumn tekstu / obiektów blob, zobacz to .źródło
W poprzednich odpowiedziach nie nalegano wystarczająco na główny problem: nawet w bardzo prostych zapytaniach, takich jak
może być wymagana tabela tymczasowa, a jeśli
VARCHAR
pole jest zaangażowane, jest konwertowane naCHAR
pole w tabeli tymczasowej. Więc jeśli masz w tabeli powiedz 500 000 linii zVARCHAR(65000)
polem, sama kolumna użyje 6,5 * 5 * 10 ^ 9 bajtów. Takie tabele tymczasowe nie mogą być obsługiwane w pamięci i są zapisywane na dysku. Można oczekiwać, że wpływ będzie katastrofalny.Źródło (z metrykami): https://nicj.net/mysql-text-vs-varchar-performance/ (Odnosi się to do obsługi
TEXT
vsVARCHAR
w „standardowym” (?) Silniku pamięci MyISAM. W innych może być inaczej, np. InnoDB.)źródło
Istnieje OGROMNA różnica między VARCHAR a TEKSTEM. Podczas gdy pola VARCHAR mogą być indeksowane, pola TEXT nie. Pola typu VARCHAR są przechowywane w linii, podczas gdy TEKST jest przechowywany w trybie offline, w rzeczywistości zapisywane są tylko wskaźniki do danych TEKSTU.
Jeśli musisz zaindeksować swoje pole w celu szybszego wyszukiwania, zaktualizuj lub usuń niż przejdź do VARCHAR, bez względu na to, jak duże. VARCHAR (10000000) nigdy nie będzie taki sam jak pole TEXT, ponieważ te dwa typy danych mają różny charakter.
niż iść do TEKSTU.
źródło
Varchar jest przeznaczony do małych danych, takich jak adresy e-mail, natomiast Text do znacznie większych danych, takich jak artykuły prasowe, Blob do danych binarnych, takich jak obrazy.
Wydajność Varchar jest większa, ponieważ działa całkowicie z pamięci, ale nie będzie tak, jeśli dane są zbyt duże, jak
varchar(4000)
na przykład.Z drugiej strony, tekst nie przylega do pamięci i ma wpływ na wydajność dysku, ale można tego uniknąć, oddzielając dane tekstowe w osobnej tabeli i stosując zapytanie o lewe połączenie w celu pobrania danych tekstowych.
Kropelka jest znacznie wolniejsza, więc używaj jej tylko wtedy, gdy nie masz zbyt wielu danych, takich jak 10000 obrazów, które kosztują 10000 rekordów.
Postępuj zgodnie z tymi wskazówkami, aby uzyskać maksymalną prędkość i wydajność:
Użyj varchar do imienia, tytułów, e-maili
Użyj tekstu dla dużych danych
Oddziel tekst w różnych tabelach
Użyj zapytań Left Join o identyfikatorze, takim jak numer telefonu
Jeśli zamierzasz użyć obiektu Blob, zastosuj te same wskazówki, co w tekście
Spowoduje to, że zapytania będą kosztować milisekundy w tabelach z danymi> 10 M i rozmiarem do 10 GB.
źródło