![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 0 Dołączył: 25.12.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam, pomóżcie ułożyć prawidłowo zapytanie bo nie dźwigam tematu.
Są 4 tabele: -firmy -produkty -produkt_firma -miasta. produk_firma to tabela łącząca firmy z produktami ![]() ![]() ![]() ![]() Pisząc po ludzku chodzi o to. Wyświetl firmy (łącznie z miastami w których one są) które oferują produkt o id_produktu=577 i znajdują się w odległości mniejszej niż 20km od miasta o współrzędnych 21.20563 i 50.56122 i dodatkowo status firmy=1 i jakieś tam sortowanie na koniec. W kwestii wytłumaczenia. Mój plan był taki żeby pierwsze obliczyć w php i odciąć wszystkie niepotrzebne miejscowości poza tymi które znajdują się w zakresie poszukiwań (powstaje kwadrat z miastami). Następnie trzeba "zakreślić w tym kwadracie koło i odciąć niepotrzbne rogi" czyli wzór na koło x^2+y^2<r^2 a w mysql - (sqrt( POW(dlugosc-21.20563,2)+POW(szerokosc-50.56122,2) )<20*0.013994 ) Współczynnik 0.013994 musi być ale to nie ważne teraz. Miast w bazie jest 1000 a docelowo kiedyś 50000 więc nie chce mysleć co się wtedy będzie działo ![]() Ostatecznie wszystko działa ale cholernie woooolno bo takie zapytanie wykonuje się około 0.5s a każda część z osobna, nawet ta obliczająca pierwisatki - 0.001s, różnica kolosalna. Dopiero zaczynam zabawe w sql i nie bardzo kumam jak to zoptymalizować. Pomóżcie, oto zapytanie.
ps. pewne rzeczy pominąłem i uprościłem a współrzędne geo są z rękawa bo nie mam na razie prawdziwych ps ps. zdaje sobie sprawę że w zapytaniu jest zapewne wiele bezsensów |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
a coś takiego? pisane z placa
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 0 Dołączył: 25.12.2012 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki, działa to w takiej formie.
Teraz zapytanie się wykonuje szybciej, około 0.14s dobre i to ![]() ![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
może masz nie pozakładane indeksy na odpowiednie kolumny bo na to by wskazywało
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 0 Dołączył: 25.12.2012 Ostrzeżenie: (0%) ![]() ![]() |
No trochę krócej ale ciężko mi ocenić bo te czasy są raz 0,14 raz 0,5 a czasem 0,00 (bezpośrednio na serwerze przez putty)
a ta wersja skrócona cały czas 0,00 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Musisz po prostu znaleźć, co Ci robi ten długi czas. Podziel sobie zapytanie, usuwaj konkretne where i wtedy zlokalizujesz przyczynę. Sprawdzaj zapytania z wyłączonym cache (znajdzie w google jak to zrobić).
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Ew. zrób explain i pokaż wynik z całego zapytania
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 16.07.2025 - 07:21 |