Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: szybkość kontra objętość
Forum PHP.pl > Forum > Bazy danych > MySQL
flashdev
Witam,

Projektuję bazę danych i chciałbym użyć typu tekstowego na minimum 1000 znaków czyli pole CHAR, oraz VARCHAR odpada.
Z jakiegoś artykułu wiem, że jeśli chce mieć szybkie wyszukiwanie muszę użyć CHAR, wtedy adres danej komórki można w oczywisty sposób obliczyć, ponieważ znamy rozmiar każdego wpisu.
I teraz pytanie:
Który typ danych większy od 255 znaków zajmuje w pamięci stałą liczbę bajtów niezależnie od ilości danych?
Czy ma ktoś link do jakiegoś ładnego zestawienia tych typów w tabelce, z podziałem na te dwie różne możliwości?
artega
Cytat
Projektuję bazę danych i chciałbym użyć typu tekstowego na minimum 1000 znaków czyli pole CHAR, oraz VARCHAR odpada.

A sprawdziłeś? Dokumentacja mówi inaczej
Cytat
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.

Cytat
Z jakiegoś artykułu wiem, że jeśli chce mieć szybkie wyszukiwanie muszę użyć CHAR, wtedy adres danej komórki można w oczywisty sposób obliczyć, ponieważ znamy rozmiar każdego wpisu.

Informacje wyssane z palca czy poparte testami? Żaden typ nie będzie miał znaczącej wyższości nad drugim jeżeli wyszukujesz klauzulą LIKE - jeżeli chcesz mieć bardzo szybkie wyszukiwanie pełnotekstowe to użyj sphinx'a
Cytat
Który typ danych większy od 255 znaków zajmuje w pamięci stałą liczbę bajtów niezależnie od ilości danych?

Jedynie char może mieć stałą liczbę znaków (nie mylić ze stałą liczbą bajtów).
Cytat
Czy ma ktoś link do jakiegoś ładnego zestawienia tych typów w tabelce, z podziałem na te dwie różne możliwości?

http://dev.mysql.com/doc/refman/5.1/en/char.html
flashdev
Cytat(artega @ 5.01.2009, 18:22:06 ) *
A sprawdziłeś? Dokumentacja mówi inaczej

Faktycznie VARCHAR to umozliwia, a zasugerowałem poniższym zapytaniem, a VARCHARa nie sprawdziłem ponieważ jak wynika z mojego postu nie jest mi potrzebny.
zapytanie SQL:
ALTER TABLE `whois_pl` ADD `test` CHAR( 1000 ) NOT NULL AFTER `data`
MySQL zwrócił komunikat:
#1074 - Column length too big for column 'test' (max = 255); use BLOB or TEXT instead

Cytat(artega @ 5.01.2009, 18:22:06 ) *
Informacje wyssane z palca czy poparte testami? Żaden typ nie będzie miał znaczącej wyższości nad drugim jeżeli wyszukujesz klauzulą LIKE - jeżeli chcesz mieć bardzo szybkie wyszukiwanie pełnotekstowe to użyj sphinx'a

Informacje wynikajace ze zdrowego rozsądku. Jeżeli wiem, ze wpis w bazie danych zajmuje dokładnie 1378 bajtów a chce wyciągnąć 15 678 wpis to wyciągam z zawartośc pamieci z pod adresu: 1378*15678.
Nigdzie nie wspominałem o klauzuli LIKE, chce tylko trzymać te dane w tabeli i móc jak najszybciej wyciągnąć je przy pomocy id.

Cytat(artega @ 5.01.2009, 18:22:06 ) *
Jedynie char może mieć stałą liczbę znaków (nie mylić ze stałą liczbą bajtów).

Czyli rozumiem, że pozostaje mi tylko pocięcie danych na 4 części i wrzucenie do 4 osobnych CHARów?
artega
Cytat
Informacje wynikajace ze zdrowego rozsądku.

Nie zawsze się sprawdza winksmiley.jpg
Cytat
Jeżeli wiem, ze wpis w bazie danych zajmuje dokładnie 1378 bajtów a chce wyciągnąć 15 678 wpis to wyciągam z zawartośc pamieci z pod adresu: 1378*15678.

Tak ale taka sytuacja wchodzi w gre tylko wtedy kiedy cały rekord ma stałą szerokość i użyasz formatu ROW_FORMAT=FIXED na tabeli.
Cytat
Czyli rozumiem, że pozostaje mi tylko pocięcie danych na 4 części i wrzucenie do 4 osobnych CHARów?

Nie rozumiem, dlaczego aż tak obawiasz się minimalnego spadku wydajności przy stosowaniu ciągów różnej długości. Podaj konkretny przykład może inne rozwiązanie będzie wydajniejsze.
marcio
Cytat
ALTER TABLE `whois_pl` ADD `test` CHAR( 1000 ) NOT NULL AFTER `data`
MySQL zwrócił komunikat:
#1074 - Column length too big for column 'test' (max = 255); use BLOB or TEXT instead

Z tego co mi wiadomo to taki blad masz dlatego ze masz limit na char max 255 znakow tez tak mam na szu.pl i uzywam text a na localhoscie moge ile chce
flashdev
Cytat(artega @ 5.01.2009, 19:47:02 ) *
Tak ale taka sytuacja wchodzi w gre tylko wtedy kiedy cały rekord ma stałą szerokość i użyasz formatu ROW_FORMAT=FIXED na tabeli.


Dokłądnie o to mi chodziło.
Zauważyłem, że po wyborze mechanizmu składowania na MRG_MYISAM niezależnie czy używam CHAR, VARCHAR, czy TEXT format wiersza jest stały.
Tylko przy wyborze MYISAM format zależy od tego jakie typy danych wybierzemy.
Dzięki za pomoc smile.gif

Cytat(artega @ 5.01.2009, 19:47:02 ) *
Nie rozumiem, dlaczego aż tak obawiasz się minimalnego spadku wydajności przy stosowaniu ciągów różnej długości. Podaj konkretny przykład może inne rozwiązanie będzie wydajniejsze.

Duuużo rekordów smile.gif 10^6 i wiecej. Chyba moje obawy są uzasadnione?

@marcio
Jeżeli chcesz to specjalnie dla Ciebie założe temat z kodem tego błędu i zapytam co oznacza ten błąd winksmiley.jpg
artega
Cytat
Duuużo rekordów 10^6 i wiecej. Chyba moje obawy są uzasadnione?

Pamiętaj, że jeżeli masz stałą szerokość wierszy to baza musi wykonać więcej operacji I/O nawet jeżeli jest tych znaków kilka w rekordzie to 1000 znaków musi odczytać wieć nijak ma się to do optymalnego odczytu.
flashdev
Ale wydaje mi się, że przy zmiennej szerokości rekordów mogą być spore problemy przy edycji wpisów, usówaniu ich i dodawaniu nowych w puste miejsca. Coś jak defragmentacja dysku.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.