2012-01-16 18 views
5

dlaczego i jak rozwiązać problem na mysql.MySQL SELECT jest bardzo powolny, ponieważ LONGBLOB

table xxx 
-> id primary key 
-> name varchar 255 
-> data longblob 

kiedy zapisać się do tej tabeli 100 plików, każdy 100MB, tabela musiałby 10GB

a następnie spróbuj wybrać dowolny wiersz ... trwa długo

SELECT name FROM xxx WHERE id = 50 LIMIT 1; 

trwa około 8 sekund

mój problem jest prawdopodobnie taki, że mysql czyta cały wiersz, zanim wróci name, który ma tylko 255 znaków ... więc gdy chcę wyświetlić listę 100 plików, m ysql czyta 10 GB i zwraca około 2 KB wyniku.

+0

StackExchange pokazuje podgląd twojego pytania/odpowiedzi podczas pisania. Proszę spojrzeć na podgląd i upewnić się, że formatowanie jest poprawne. Jeśli wstępnie sformatowany kod, który napiszesz, wyświetlany jest jako pojedyncza linia w podglądzie, tak będzie wyglądać dla wszystkich pozostałych. Dlatego użyj przycisku "próbka kodu", aby sformatować go poprawnie (lub po prostu umieść 4 spacje przed każdą linią, a SE będzie wiedział, że jest to preformatowany kod). –

Odpowiedz

6

Spróbuj podzielić plamy na osobny stolik.

Na przykład można mieć stolik xxx zawierającą kolumny id i name, a drugi stół xxx_data zawierającą kolumny id i data. Jeśli chcesz tylko nazwę, w ogóle nie musisz pytać o tabelę xxx_data; Jeśli potrzebują zarówno nazwę i dane, można połączyć ze sobą za pomocą tabel współdzielony klucz podstawowy id:

SELECT id, name, data 
FROM xxx JOIN xxx_data USING (id) 
WHERE id = ... 

Aby uzyskać więcej informacji i optymalizacji pomysłów, patrz np 10 tips for optimizing MySQL queries.

+2

Dodałbym po prostu, że należy rozważyć przechowywanie tych plików w systemie plików zamiast w bazie danych. Oczywiście istnieją powody, aby przechowywać je w bazie danych (takie jak bezpieczeństwo, łatwe usuwanie, łatwe replikowanie na wielu serwerach itp.), Ale wyobraź sobie, że chcesz zwrócić 10 plików ... zapytanie do bazy danych, a następnie zapisać 10 * 100 MB w RAM. Czy naprawdę chcesz zużywać 1 GB pamięci RAM na serwerze tylko po to, aby zwrócić pliki, podczas gdy możesz po prostu przesłać je z jakiejś lokalizacji na serwerze? Myślę, że twoje pliki są zbyt duże, aby można je było przechowywać w bazie danych. –

+1

Jeśli nie potrzebujesz absolutnie potrzebnych danych w bazie danych, możesz również przenieść je do systemu plików. Myślę, że działa to lepiej, gdy masz do czynienia z dużą ilością plików lub dużych plików. –

Powiązane problemy