![]() |
![]() |
![]()
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? :-( -------------------- Warsztat: PHP 4.3.2 :: APACHE 1.3.27 :: Notatnik 1.0 :)
<b>OC-FORUM</b> |||||||||||||||||||| 80% completed |
|
|
![]() |
![]()
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?
-------------------- PHP Developer
"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola |
|
|
![]()
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ć?
![]() -------------------- Warsztat: PHP 4.3.2 :: APACHE 1.3.27 :: Notatnik 1.0 :)
<b>OC-FORUM</b> |||||||||||||||||||| 80% completed |
|
|
![]()
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. -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
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 :-) -------------------- Warsztat: PHP 4.3.2 :: APACHE 1.3.27 :: Notatnik 1.0 :)
<b>OC-FORUM</b> |||||||||||||||||||| 80% completed |
|
|
![]()
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 ![]() -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
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 :-) -------------------- Warsztat: PHP 4.3.2 :: APACHE 1.3.27 :: Notatnik 1.0 :)
<b>OC-FORUM</b> |||||||||||||||||||| 80% completed |
|
|
![]()
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 ) -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
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 -------------------- Warsztat: PHP 4.3.2 :: APACHE 1.3.27 :: Notatnik 1.0 :)
<b>OC-FORUM</b> |||||||||||||||||||| 80% completed |
|
|
![]()
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
![]() Pozdrawiam -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
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! -------------------- Warsztat: PHP 4.3.2 :: APACHE 1.3.27 :: Notatnik 1.0 :)
<b>OC-FORUM</b> |||||||||||||||||||| 80% completed |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 06:00 |