![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 25.02.2004 Skąd: Brusy Ostrzeżenie: (0%)
|
Jak w temacie.
Mam problem z zapytaniem do bazy w mysql. Trwa ono nieskończenie długo (lub ~ 154sekundy).
Są takie 4 tabele. Napisałem wyszukiwarkę, która pięknie działała na małej ilości użytkowników. Przy ponad 1700 - zaczyna się problem - zapytanie trwa zbyt długo, baardzo obciąża serwer. Wygląda ono następująco: (przykładowo)
Problemem są ogromne tabele - londoner_users_spheres - ma ponad 68.600 rekordów oraz londoner_users_types - ponad 7000. Może macie jakieś pomysły? :-( |
|
|
|
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 1 640 Pomógł: 28 Dołączył: 13.02.2003 Skąd: Międzyrzecz/Poznań Ostrzeżenie: (0%)
|
Czy przy tej wyszukiwarce potrzebne jest az tyle table, a moze sprobujesz podzapytania?
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 25.02.2004 Skąd: Brusy Ostrzeżenie: (0%)
|
Jak proponowałbyś to zrobić? (IMG:http://forum.php.pl/style_emoticons/default/rolleyes.gif)
|
|
|
|
Post
#4
|
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
napisz, do czego służy ta baza, oraz jakie dane chcesz pobierać tym zapytaniem.
Może pomyślimy o optymalizacji struktury lub samego zapytania. |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 25.02.2004 Skąd: Brusy Ostrzeżenie: (0%)
|
Baza ta służy do pobrania listy tłumaczy spełniających dane kryteria:
1. wykonujących daną "kombinację językową" - combination_id 2. mieszkają w danym województwie - province_id 3. tłumaczą w danej specjalizacji - sphere_id 4. wykonują dany typ tłumaczenia - type_id. W tabeli londoner_users znajdują się tłumacze oraz ich dane. W tabeli londoner_users_combinations znajdują się ID kombinacji, ID użytkownika oraz kwota, za jaką dane tłumaczenie wykonuje (w tym przypadku możną ją pominąć) W tabeli londoner_users_types znajdują się userzy (user_id) i odpowiadające im typy tłumaczeń (type_id) oraz za ile to wykonują (bez znaczenia również) W tabeli londoner_users_spheres są userzy (user_id) jak i przyporządkowane im specjalizacje (sphere_id). Jeśli coś przeoczyłem - przepraszam, dajcie cynk - zaraz dopiszę. Już w tym momencie dziękuje za chęć pomocy :-) |
|
|
|
Post
#6
|
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
Zacznijmy od optymalizacji zapytania.
W zapytaniu tym nie ma żadnych argumentów uzasadniających użycie GROUP BY W związku z tym proponuję użyć klauzuli DISTINCT user_id , która jest znacznie szybsza. Co dalej? Jeśli możesz - podaj jeszcze strukturę jednej brakującej tabeli. Dodatkowo - jeśli możesz - udostępnij gdzieś plik z przykładowymi danymi w tych tabelach (ale nie wrzucaj ich na forum (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) tak bym mógł to sobie potestować na prawdziwych, logicznych związkach. |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 25.02.2004 Skąd: Brusy Ostrzeżenie: (0%)
|
Oto brakująca tabelka :-) Zaraz podam przykładowe dane :-) |
|
|
|
Post
#8
|
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
Ok. No to bawimy się dalej.
Teraz struktura bazy. Na wszystkie kolumny, będące kluczami zewnętrznymi zakładamy indexy. (klucze zewnętrzne, to np. londoner_users_spheres.user_id ) Zasade tą stosujemy na WSZYSTKICH połączeniach pomiędzy tabelami. Edited: Mały test, już z danymi Bez żadnych indexów: 0.4449 sekundy Z wszystkimi indexami: 0.0122 sekundy Teraz DISTINCT zamiast GROUP: 0.0112 sekundy (o dziwo niewiele to dało. hmm ) |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 25.02.2004 Skąd: Brusy Ostrzeżenie: (0%)
|
http://www.oc-forum.org/baza.zip - tutaj są wszelkie dane.
(a indexy już zakładam :-) ) // wrzuciłem poprawioną wersję danych z bazy, w poprzednim pliku się dublowały niektóre rekordy (3-krotnie), pod powyższym linkiem jest już dobra wersja. EDIT: O kurcze, pododawałem indexy, znalazłem też inny błąd: pole sphere_id w londoner_users_spheres ... było varcharem (wielka pomyłka, już poprawiłem) - cyka wszystko niesamowicie pięknie teraz z tego co widzę. Będę jeszcze testował Wielkie dzięki za pomoc! Ten post edytował sheldon 25.12.2005, 22:05:11 |
|
|
|
Post
#10
|
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław |
I dlatego wole Postgresa... On by nie pozwolił na taki związek (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Pozdrawiam |
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 25.02.2004 Skąd: Brusy Ostrzeżenie: (0%)
|
Ja jeszcze raz bardzo dziękuję za pomoc, a przy okazji się czegoś nauczyłem - czegoś, co powinienem wiedzieć od dawna :-)
Jeszcze raz pozdrawiam! |
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 13:07 |