Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Szukanie po VARCHAR czy po INT
Forum PHP.pl > Forum > Bazy danych
lukasamd
Witam,
mam pewne pytanie - chciałbym zrobić sobie na stronie pełne seo. Jak wiadomo, na większości stron artykuły sa jakoś numerowane i potem zapytanie szuka w bazie artykułu o danym id. Przykład z wykorzystaniem rewrite:


adres_strony/artykul1/bezsensowny-tekst
na
adres_strony/artykuly.php?artykul_id=1


No i mamy zapytanie do bazy:

  1. SELECT * FROM artykuly WHERE artykul_id=".$_GET['artykul_id']."

kwestię zabezpieczenia przed sql injection pomijam

Powiedzmy że chciałbym zrobił pełne seo, bez numeracji:


adres_strony/artykul/tytul
na
adres_strony/artykuly.php?artykul_url=tytul


i analogicznie:

  1. SELECT * FROM artykuly WHERE artykul_url=".$_GET['artykul_url']."


No i dochodzimy do mojego pytania - czy skorzystanie z pełnego seo i przeszukiwania tabeli pod kątem wartości typu varchar będzie wolniejsze niż w przypadku wartości typu int? Zakładam, że i w pierwszym i drugim wypadku na wartość jest wrzucony indeks (w obu wypadkach artykul_id robi za primary key, w drugim artykul_url jest dodatkowym indeksem).

Co lepiej zrobić biorąc za najważniejszy element wydajność? Czy spadek wydajności przy szukaniu na varchar jest odczuwalny i na tyle istotny, żeby rezygnowac z pełnego seo?
legorek
No wydajność będzie trochę gorsza, a po drugie co jeśli będą dwa takie same tytuły? Już lepiej dodać gdzieś to id:

adres_strony/artykul/1/tytul

I Oczywiście szukać tylko po id, a a tytuł przy wykonywaniu zapytań ignorować.

Tak zazwyczaj się to robi. Przykład choćby z tvn24:

http://www.tvn24.pl/-1,1584782,0,1,tusk-pi...,wiadomosc.html
http://www.tvn24.pl/-1,1584782,0,1,Ala-ma-...wiadomosc.html
lukasamd
Zadbanie o to, aby nie było duplikatów to nie problem.

Czy wydajność będzie odczuwalnie mniejsza? Powiedzmy przy 10 userach online, co będzie przy 30 lub 50 online?
Długość pola ma wpływ na czas szukania (np. VARCHAR(200) vs VARCHAR(50))?
O ile dobrze widzę to rozwiązanie takie jest wrzucone do wordpressa - można ustawić takie adresy, że nie znajdziemy w nich żadnych "numerków".
legorek
Cytat
Czy wydajność będzie odczuwalnie mniejsza? Powiedzmy przy 10 userach online, co będzie przy 30 lub 50 online?

Najlepiej po prostu sprawdź. Z resztą co to za jednostka userzy online? Jak już to może requsety na sekundę. Nie jest to tak dramatycznie wolne jeśli odpowiednio zdefiniujesz klucze, ale osobiście uważam, że rezygnowanie z ID to głupi pomysł bardziej od strony użytkowej niż programistycznej. Mnie taki linki zwyczajnie wkurzają.

Cytat
Długość pola ma wpływ na czas szukania (np. VARCHAR(200) vs VARCHAR(50))?

Na pewno wpływ ma długość klucza.
lukasamd
No to olać, wstawię z id. Resztę adresu też zapisuję do bazy - nie ma sensu go za każdym razem dekodować.

[edit]
A jednak nie mogę użyć INTa - po prostu zapomniałem o tym, że później dodawane są inne elementy z innych tabel, za dużo zależy od dostępności adresu w jednej z nich, więc będzie to lepsze rozwiązanie.

Tak więc, co mogę zrobić, aby wyszukiwanie po varchar chodziło najszybciej jak się tylko da? Oczywiście wrzucam jako index. Szuanie jest z warunkiem WHERE url=zmienna więc like też nie ma tu nic do gadania. Co mogę jeszcze poprawić?
radone
Cytat(lukasamd @ 11.02.2009, 21:56:14 ) *
Co mogę jeszcze poprawić?


Nie wiem jaki wybrałeś typ tabeli, ale w tym przypadku podejrzewam że najlepszy będzie MyISAM, doczytaj sobie tutaj link
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.