Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SQL] wydajność wyszukiwania w bazie po nazwie, $_GET=VARCHAR zamiast INT, a wydajność
phpuser88
post 5.12.2021, 01:56:22
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Zastanawiam się czy przy kilkunastu tysiącach rekordów w SQL (MariaDB) będzie duży problem jeżeli będę wyszukiwał rekordy za pomocą nazwy(VARCHAR) zamiast id(INT)?
Chodzi o wczytywanie zawartości z kilku tabel za pomocą wartości textowej z linku $_GET . Kiedyś, kilka lat temu gdzieś wyczytałem że generuje to dużo większe obciążenie i nie warto, a mi zależy na ładnych linkach bez cyfr i zastanawiam się jak podejść do problemu...

Miał ktoś może już z tym doświadczenie? Myślę nad takim rozwiązaniem:
1. Utworzyć nową tabele `link` z VARCHAR (nazwa linku) i INT (id linku), a następnie po wprowadzeniu linku w adres przeglądarki zapytać tabele `link` i dopiero później zapytać właściwe tabele z treścią po ID - ale czy to będzie szybsze niż szukanie bezpośrednie po nazwie w tabeli pierworodnej? tym bardziej, że link będzie się składać z dwóch wartości textowych...

Jeszcze nad tym nie pracuje, ale czeka mnie to w najbliższych dniach i myślę jak to ugryżć najlepiej wydajnościowo. Może jest na to konkretne rozwiązanie? z góry dzięki za komentarze.
Go to the top of the page
+Quote Post
aras785
post 5.12.2021, 12:17:45
Post #2





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


Prawdopodobnie chcesz szukać po tzw. slug - odpowiadając: dodaj index dla kolumny slug/link i nie zauważysz żadnej różnicy.
Go to the top of the page
+Quote Post
phpuser88
post 5.12.2021, 17:49:05
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź. Czyli wychodzi na to, że jednak wyjściem będzie utworzenie dodatkowej tabeli z wartością tekstową i ID linku, a następnie przy otrzymaniu linku np. /nazwa-listy będzie trzeba odpytać SQL, aby uzyskać ID_listy i następnie za pomocą ID_listy odpytać kilka pozostałych tabel w celu wczytania wszystkich danych na podstrone... hmm... sadsmiley02.gif
Go to the top of the page
+Quote Post
aras785
post 5.12.2021, 17:56:53
Post #4





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


Nie wiem jak masz to rozwiązane ale jeśli chcesz pobierać zawartość jakiegoś wpisu w bazie po VARCHAR zaniast INT (np. ID) to dodaj kolumne: link lub slug i po prostu zamiast WHERE id = :id, zrób WHERE slug = :slug lub WHERE link = :link (https://mansfeld.pl/programowanie/kurs-pdo-bazy-danych-php/)
Go to the top of the page
+Quote Post
phpuser88
post 5.12.2021, 18:11:27
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Hm.. może posłużmy się jakimś przykładem:
Link: local/podstrona.php?load=nazwa
Zostanie przerobiony za pomoca htaccess na: local/podstrona/nazwa

Teraz za pomocą $_GET['load'] bede musial wczytac dane z kilku tabel (A,B,C,D) i tu pojawia się pytanie czy w kazdej tabeli utworzyc kolumne `link` (link==nazwa) i za pomoca `link` wczytywac odpowiednie dane, czy moze lepiej utworzyc jedna dodatkową tabele (X) gdzie najpierw znajde globalne `ID` dla podstrony za pomoca `link==nazwa` i pozniej za pomoca `ID` zapytac o dane tabele (A,B,C,D)?

z tyłu głowy ciągle myślę o wydajności znajdywania tekstu w SQL zamiast liczb.

Troche łapatologiczny opis, ale lepszy taki niz wcale^^ dzięki!

Ten post edytował phpuser88 5.12.2021, 18:13:48
Go to the top of the page
+Quote Post
viking
post 5.12.2021, 18:40:10
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Zapewne daleko ci jeszcze do problemu wydajności. Jakbyś miał kilkanaście milionów rekordów to wtedy możesz się martwić.


--------------------
Go to the top of the page
+Quote Post
phpuser88
post 5.12.2021, 18:46:51
Post #7





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Myślę przyszłościowo, ale jak widać zbyt poważnie podchodzę do tematu wydajności przez wyszukiwanie za pomocą nazwy zamiast id. Dzięki.
Go to the top of the page
+Quote Post
trueblue
post 5.12.2021, 18:51:20
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Jak rozumiem link czy jego fragment szukasz w kilku tabelach - dlaczego tak się dzieje?


--------------------
Go to the top of the page
+Quote Post
phpuser88
post 5.12.2021, 18:59:21
Post #9





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


@trueblue, chcę wczytać zawartość podstrony za pomocą wartości $_GET z linku, ale chce też posiadać linki bez numerków i stąd zapytanie jak to najlepiej rozwiązać.
Go to the top of the page
+Quote Post
trueblue
post 5.12.2021, 21:42:03
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ale moje pytanie dotyczyło czego innego.
Dlaczego na podstawie $_GET['load'] przeszukujesz kilka tablic?


--------------------
Go to the top of the page
+Quote Post
phpuser88
post 5.12.2021, 23:13:48
Post #11





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Bo śmigam na starym strukturalnym PHP 5.6 i jest to bardzo wygodne i bezpieczne rozwiązanie po uprzednim filtrze zawartości $_GET mellow.gif
Go to the top of the page
+Quote Post
trueblue
post 6.12.2021, 08:45:37
Post #12





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Chyba się nie dogadamy.
Co ma wersja PHP do bazy danych?

Cały czas pytam dlaczego przeszukujesz tablice A, B, C, D, a nie jedną tablicę, pod kątem wartości zmiennej $_GET['load']?


--------------------
Go to the top of the page
+Quote Post
phpuser88
post 6.12.2021, 14:49:53
Post #13





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Przy wczytywaniu danych z SQL sposób i wersja PHP ma znaczenie z tego co zauważyłem po obecnie panujących standardach obiektowych.
Tablica A to podstawowe dane. B+C to różne dane dodatkowe, a D to zdarzenia w formie jeśli $_GET['X'] istnieje w `D` to wyświetl X.

Tylko że... nie operuje na gotowym przykładzie, to wszystko jest jedynie wizją niedalekiej przyszłości nad którą zastanawiam się w formie odskoczni od tworzenia kompletnego front-end'a.
Teraz pomyślałem, że rozwiąże wyczytywanie danych z kilku tabel w inny sposób. Mianowicie utworze dodatkową tablice cache, napisze osobny skrypt, który odpyta wszystkie tablice za pomocą crona co określony czas (lub lepiej, co określony update/insert) i skumuluje wszystkie niezbędne dane w tablicy cache, żeby później zaoszczędzić na wydajności przeszukiwania kilku tablic jednocześnie X razy.
Kolejnym krokiem zaoszczędzenia na wydajności wydaje się być generowanie w całości, wraz z wszystkimi danymi najpopularniejszych stron - mam dobry tok myślenia czy przesadzam i tablica z cache wystarczy?
Ostatnio programowałem w PHP coś "większego" z 10 lat temu i teraz moja wiedza jest jedynie historią...
Go to the top of the page
+Quote Post
aras785
post 6.12.2021, 15:16:20
Post #14





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


Szukasz rozwiązania dla problemu który nie istnieje i póki co zostaw wydajność w spokoju.
Sprawdź sobie jak buduje się relacje między tabelami... szybki przykład poniżej: https://www.db-fiddle.com/f/eEw6tAEd6UTPQDbQhqc2ot/1

Operuję tylko na pages, resztę sobie wczytuję niezależnie od LINKU/SLUG.

Ten post edytował aras785 6.12.2021, 15:17:21
Go to the top of the page
+Quote Post
trueblue
post 6.12.2021, 15:27:55
Post #15





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Proponowałbym jednak założyć indeks (zwykły lub unikalny) na polu ze slug'iem.


--------------------
Go to the top of the page
+Quote Post
phpuser88
post 6.12.2021, 15:42:14
Post #16





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


Tak zrobię, zostawię wydajność w spokoju.
Przykład jest świetny jako przedstawienie problemu i przypomnienie podstaw SQL.
Nałożę też indexa na sluga.

Dzięki wielkie za wsparcie i nakierowanie na prawidłowy tok myślenia.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 07:00