2012-12-07 8 views
14

Podczas wyszukiwania przez SO, znalazłem dwie sprzeczne odpowiedzi (a nawet komentarz, który to stwierdził), ale brak ostatecznej odpowiedzi:zapisać TEKST/BLOB w tym samym stole, czy nie?

Problem polega na tym, czy istnieje jakakolwiek korzyść z wydajności, jeśli przechowujesz pole TEKST/BLOB poza stołem?

Zakładamy:

  • Państwo prawidłowo wybrać (tylko WYBORU TEXT/BLOB jeśli wymagane żadne select *)
  • Tablice są indeksowane prawidłowo, gdzie ma to sens (tak, to nie jest kwestia " jeśli ją zindeksować ")
  • Projekt bazy danych naprawdę nie ma znaczenia. Jest to kwestia do zidentyfikowania zachowania MySQL w tym szczególnym przypadku, a nie do rozwiązania pewnych problemów związanych z projektowaniem bazy danych. Załóżmy to Baza danych ma tylko jedną tabelę (lub dwóch, jeśli TEXT/BLOB zostaje oddzielony)
  • Silnik: InnoDB (inne byłoby ciekawe też, jeśli oni pobierać różne wyniki)

ten post stany, że umieszczenie TEKSTU/BLOBA w oddzielnej tabeli, pomaga tylko wtedy, gdy już wybrałeś w niewłaściwy sposób (zawsze WYBIERAJĄC TEKST/BLOB, nawet jeśli nie jest to konieczne) - zasadniczo stwierdzając, że TEKST/BLOB w ta sama tabela jest w gruncie rzeczy lepszym rozwiązaniem: (mniej złożoności, brak wydajności, itp.), ponieważ TEKST/BLOB jest przechowywany niezależnie i tak

Jedynym momentem, w którym przenoszenie kolumn TEXT do innej tabeli przyniesie jakąkolwiek korzyść, jest tendencja do wybierania zazwyczaj wszystkich kolumn z tabel. Jest to jedynie wprowadzenie drugiej złej praktyki, aby zrekompensować pierwszą. Nie trzeba dodawać, że te dwie krzywdy to nie to samo, co trzy lefty.

MySQL Table with TEXT column


Ten post, stwierdza jednak, że:

Jeśli tabela zawiera tekst lub BLOB kolumn w tabeli nie mogą być przechowywane w pamięci

Czy to oznacza, że ​​wystarczy już TEXT/BLOB w tabeli, aby uzyskać wydajność?

MySQL varchar(2000) vs text?


Moje pytanie zasadniczo brzmi: Jaka jest prawidłowa odpowiedź?

Czy to naprawdę ma znaczenie, jeśli zapisujesz TEKST/BLOB w oddzielnej tabeli, jeśli prawidłowo wykonałeś SELECT?

Czy nawet posiadasz TEKST/BLOB wewnątrz stołu, możesz stworzyć potencjalne trafienie wydajności?

+1

Każdy konkretny aparat do przechowywania danych, którego używasz? InnoDB/MyISAM/NDB, itp. – gertvdijk

+0

@gertvdijk Dodałem go - jestem szczególnie zainteresowany rozwiązaniem dotyczącym InnoDB - ale zasadniczo, jeśli jest różnica, MyISAM i inne silniki pamięciowe również będą interesujące – Katai

Odpowiedz

12

Jeśli dostępne od wersji MySQL, użyj formatu pliku InnoDB Barracuda korzystając

innodb_file_format=barracuda 

w konfiguracji MySQL i skonfigurować tabele używając ROW_FORMAT=Dynamic (lub Compressed), aby rzeczywiście go używać.

Spowoduje to, że InnoDB będzie przechowywać BLOBy, TEKSTY i większe VARCHAR poza stronami wierszy, dzięki czemu będzie bardziej wydajny. Aby uzyskać więcej informacji, patrz this MySQLperformanceblog.com blog article.

O ile rozumiem, użycie formatu Barracuda spowoduje, że przechowywanie TEKSTÓW/BLOBÓW/VARCHARów w oddzielnych tabelach nie będzie już ważne ze względu na wydajność. Uważam jednak, że zawsze dobrze jest mieć na uwadze prawidłową normalizację bazy danych.

4

Jednym z osiągów jest posiadanie stołu o rekordach o stałej długości. Oznaczałoby to brak pól o zmiennej długości, takich jak varchar lub text/blob. W przypadku rekordów o stałej długości MySQL nie musi "szukać" końca rekordu, ponieważ zna przesunięcie wielkości. Wie również, ile pamięci potrzebuje do załadowania rekordów X. Tabele z zapisami o stałej długości są mniej podatne na fragmentację, ponieważ przestrzeń udostępniona z usuniętych rekordów może być w pełni wykorzystana ponownie. Tabele MyISAM mają w rzeczywistości kilka innych zalet z rekordów o stałej długości.

Zakładając, że używasz innodb_file_per_table, zachowanie tex/blob w osobnej tabeli zwiększy prawdopodobieństwo, że buforowanie systemu plików będzie używane, ponieważ tabela będzie mniejsza.

To powiedziawszy, jest to mikrooptymalizacja. Jest wiele innych rzeczy, które możesz zrobić, aby uzyskać znacznie większy wzrost wydajności. Na przykład użyj dysków SSD. Nie da ci to wystarczającego przyspieszenia, aby wypchnąć dzień rozrachunku, gdy twoje stoły będą tak duże, że będziesz musiał wprowadzić odłamki.

Nie słyszysz o bazach danych, które używają "surowego systemu plików", mimo że może być znacznie szybszy. "Raw" oznacza, że ​​baza danych bezpośrednio uzyskuje dostęp do sprzętu dysku, omijając dowolny system plików. Myślę, że Oracle nadal to popiera. Ale nie jest to warte dodatkowej złożoności i musisz naprawdę wiedzieć, co robisz. Moim zdaniem przechowywanie tekstu/obiektu blob w osobnej tabeli nie jest warte dodatkowej złożoności, jeśli chodzi o możliwy wzrost wydajności. Naprawdę musisz wiedzieć, co robisz i jakie masz wzorce dostępu, aby z tego skorzystać.

+0

Tak, ale co robi to znaczy dla tabeli, która faktycznie zawiera TEKST? Jeśli MySQL przechowuje TEXT zewnętrznie, powinien on być w zasadzie tylko wskaźnikiem do tej zewnętrznej pamięci, więc powinien być prawie taki sam jak przechowywanie TEKSTU w osobnej tabeli, ręcznie. Zasadniczo to pytanie, czy to już dzieje się automatycznie? (oddzielne przechowywanie) Co staram się dowiedzieć, czy to bzdura czy nie, zrobić to ręcznie. W jaki sposób obsługiwane jest automatyczne "odniesienie" do TEKSTU? – Katai

+0

Istnieje różnica między MySQL przechowywania TEXT "zewnętrznych" i przechowywania TEXT zewnętrznie w osobnym pliku. MySQL przechowuje to "zewnętrzne" w pliku, tak jak indeks i dane są przechowywane w tym samym pliku z Innodb. Jeśli przechowujesz go w oddzielnej tabeli, jest to oddzielny plik. Nie jest nonsensem robić tego ręcznie, ale nie uzyskujesz nawet 1% poprawy wydajności. Nie da się tego zmierzyć, dopóki nie otrzymasz wielu milionów rekordów. –

Powiązane problemy