![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Mam w tabeli wartość pesel. Pesel zawsze składa się z 11 cyfer. Miałem ustawiony typ bigint, ale nie wiem czy nie będzie lepiej jak wybiorę varchar(11). Słyszałem, że typy mają wpływ na wydajność. Który typ doradzacie (bigint czy varchar)?
Ten post edytował J4r0d 29.04.2005, 21:04:37 -------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
To zalezy do czego bedziesz konkretnie wykorzystywal: trzymanie danych przeszukiwanie itd.
Polecam uzyc varcha(11) -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
No ale pesel to same cyfry, a operacje na liczbach sa szybsze niz na stringach -- odpowiedz nasuwa sie sama *INT.
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 853 Pomógł: 25 Dołączył: 27.08.2003 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
poza tym BIGINT zajmie ci w pamieci 8 bajtow, a VARCHAR(11) 11 bajtow. polecam zdeklarowanie tego pola jako BIGINT(11) UNSIGNED
-------------------- "If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org |
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Widze ze sa rozne rozbierznosci tego. Tak jak pisalem to zalezy do czego bedziesz wykorzystywal, jesli bedziesz robil "operacje" na tym polu to typ bigint a jesli tylko ma byc skladowanie danych to jest to zupelnie obojetne i wtedy varchara mozesz uzyc.
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Pozwoliłem sobie zacytować odpowiedź jednego usera - nie z tego form
Cytat TO zależy jakie inne typy masz też w tabeli. Najlepiej będzie jeśli określisz jako char(11). Dlatego że char zawsze zachowuje stałą długość przechowywanych ciągów (a varchar nie). Char zawsze zapełnia ciąg spacjami na końcu do osiągnięcia łącznej długości 255 znaków (bo takie jest maximum dla char). Dzięki temu tabela nie ulega fragmentacji ("rozstrzeleniu" na dysku), a co za tym nie wymaga wykonywania OPTIMIZE po operacjach typu UPDATE itp. Jednak jeśli w tabeli są też zdefiniowane typy o zmiennej długości zachowawczej (np. blob, text, itp.) to mysql i tak zmieni typy char (stałe długościowo) na varchar (niestałe długościowo)... Ponadto, typ danych musisz uwzględniać przy projektowaniu bazy: PESEL - same cyfry, OK, ale przecież nie będziesz na tych liczbach wykonywał operacji arytmetycznych, dlatego nie ma sensu dla tego pola dawać typu liczbowego. Wygodniej dać typ ciągowy, czyli char. Wpłynie to znacznie na wydajność, nie obciąży niepotrzebnie np. pamięci serwera itp. Zachowa (większą) spójność bloków danych bazy na dysku itd. No i już zgłupiałem. Jedni tak drudzy tak.. Nie będę wykonywał żadnych operacji na zmiennej PESEL. ALe nie wiem jak to będzie w przyszłości. Podobny problem mam ze zmienną NIP i REGON. Ale narazie dałem VARCHAR odpowiednio 11,9,10 -------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 853 Pomógł: 25 Dołączył: 27.08.2003 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
w MySQL jesli masz jakiekolwiek inne pola typu VARCHAR czy tez BLOB itp. to CHARy i tak sa automatycznie zmieniane na VARCHAR.
ja sie dlaej bede trzymal BIGINT(11) UNSIGNED, bowiem nawet jak nie dokonujesz bezposrednio zadnych opercacji na kolumnie z PESELEM to i tak nie jest to samo, bowiem jak napisalem wyzej BIGINT potrzebuje mniej miejsca niz VARCHAR(11) ![]() nie mowiac juz o tym ze typ danych powinien jak najbardziej obrazowac rzeczywitsoc, a nie da sie ukryc ze PESEL jest typu numerycznego. -------------------- "If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Bardzo pouczajacy post.
W pojektcie nad ktorym procowalem uzylismy typu varchar do NIPu, PESELU, REGONu. Dziala juz ponad pol roku, dzialaja na tym 2 firmy ktore maja spora liczbe klientow i jakos jeszcze nikt nie narzekal na wydajnosc bazy. Moze to dlatego ze to Postgres. -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 853 Pomógł: 25 Dołączył: 27.08.2003 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
@SongoQ, co nie znaczy ze nie da sie zrobic wydajniej. daj mi prosze argument na to ze zastosowanie VARCHAR(11) byloby w tym przypadku lepsze niz BIGINT(11) UNSIGNED. osobiscie nie widze, ale oczywiscie nikt nie jest wszystkowiedzacy.
-------------------- "If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org |
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@sopel Zawsze da sie zrobic wydajniej, kwestia tego jak podchodzisz do danego problemu i czy jest Ci to potrzebne.
Cytat daj mi prosze argument na to ze zastosowanie VARCHAR(11) byloby w tym przypadku lepsze niz BIGINT(11) UNSIGNED. osobiscie nie widze, ale oczywiscie nikt nie jest wszystkowiedzacy. Niestety nie mam ![]() Mysle ze sie dowiemy jak to naprawde jest jesli sie wdrozymy w zagadnienia teoretyczne budowy tabel, trzymania danych w tabelach i optymalizatora. Jak juz napisales nikt nie jest wszystkowiedzacy. -------------------- |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Sam typ INT ma zakres od -2 147 483 648 do + 2 147 483 647. Gdybym zapisał INT UNSIGNED to zares będzie od 0 do 4294967295. Podobno jest to liczna 4-bajtowa. Ale składa się z 10 cyfer. Nie powinno być 1--bajtowa?
Skoro typ BIGINT składa się z 18 cyfer to nie powinien być 18-bajtowy? Pozdrawiam -------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) ![]() ![]() |
Moje badania.
Tablica z polem varchar(11), jeden wpis, 1000 zapytań na skrypt, średnia z 10 wykonań: 0.307938457s Tablica z polem bigint(11) unsigned, jeden wpis, 1000 zapytań na skrypt, średnia z 10 wykonań: 0.261060739s Z tego wynika, że operacje na bigint wydają się szybsze. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(matid @ 2005-04-30 11:39:09) Tablica z polem bigint(11) unsigned, jeden wpis, 1000 zapytań na skrypt, Dlaczeo piszesz bigint(11) a nie bigint? Co miałeś na myśli pisząc "1000 zapytań na skrypt"?? ![]() -------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#14
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@J4r0d
Cytat Podobno jest to liczna 4-bajtowa. Ale składa się z 10 cyfer. Nie powinno być 1--bajtowa? Skoro typ BIGINT składa się z 18 cyfer to nie powinien być 18-bajtowy? Wyjasnienie: Typ int jest 4 bajtowy. Ma zakres np od -2 147 483 648 do + 2 147 483 647 lu od 0 do 4294967295. Dlaczego 4 bajty? 4294967295 po zamianie na system binarny daje: 11111111 11111111 11111111 11111111, kazde 8 cyfr(bitów) to 1 bajt. Z bigint jest tak samo, tylko ze ma 8 bajtw => 64 bitów czyli 64 jedynki. @matid W tabeli bylo tylko pojedyncze pole z peselem? czy robiles rozne kombinacje? Az dla pewnosci sobie sam przetestuje. -------------------- |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) ![]() ![]() |
Cytat(J4r0d @ 2005-04-30 13:43:54) Co miałeś na myśli pisząc "1000 zapytań na skrypt"?? ![]() 1000 zapytań w pętli. Test robiłem takim kodem:
@SongoQ: Testowałem tylko na takich dwóch tabelach:
oraz
Ten post edytował matid 30.04.2005, 13:38:20 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
@matid: Ok ale dlaczego piszesz BIGINT(11) a nie BIGINT. Co to 11 oznacza?
Pozdrawiam -------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 5.02.2016 Ostrzeżenie: (0%) ![]() ![]() |
Ponieważ często wyszukuje się osoby wg PESEL wypadało by założyć na to pole indeks (można pokusić się nawet o UNIQUE) i tu bigint zdecydowanie wygrywa.
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Oprócz tego, że zasługujesz na złotą łopatę za wykopanie najstarszego postu, to zasada jest podstawowa:
używasz liczb, gdy potrzebujesz działań na liczbach (np. sumowanie, średnia itp) Przy BIGINT gubisz zera wiodące i zaczyna ci się problem np. z obliczaniem poprawności. Wiem, że można użyć ZEROFILLa, ale ... tylko na MySQL i nie wiem, czy wtedy nadal MySQL traktuje to jako liczbę... |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
PESEL? Zerofill? seriously ?
![]() Tak na prawdę to nie ma najmniejszego znaczenia czy użyjesz varchar, bigint, char czy innego... Co z tego że zajmuje 11 bajtów zamiast 8, aż tak na prawdę interesuje Cię wielkość BD? OK jeśli baza będzie miała >10mln rekordów to tak, wtedy będzie różnica. Nie ma co się czasami rozwodzić w takich przypadkach. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 04:36 |