![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie.
Mam w bazie danych realację jeden do wielu. Mam tabelę transporty oraz miejsca. Do jednego transportu może być przypisanych kilka miejsc. Aby całość trasy (wszystkie miejsca danego transportu) wyciąnąć w zapytaniu daję GROUP CONCAT:
Niestety daje mi to czas 8 sekund dla 100 rekordow. Po usunieciu GROUP_CONCAT daje mi czas 0,03s. Co próbowałem: 1. Uproszczenie GROUP_CONCAT: (SELECT GROUP_CONCAT(M.Miejscowosc SEPARATOR '-') FROM m_miejsca AS M WHERE M.ID_transport=T.ID_t ) - nic nie daje (minimalne przyspieszenie - 1,5%) 2. Przeniesienie funkcjonalności do "STORED FUNCTION" - także nic Czy ktoś ma jakiś pomysł? -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
daj explain
pewnie wystarczy indeksy poprawić |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Zapomniałem powiedzieć - indeksy działają. Rozmiar danych nie jest zatrważający:
transporty 14 000 rekordów miejsca 32 000 rekordów -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
a masz pewność że indeksy są prawidłowe ?
dla pewności pokarz wynik explain |
|
|
![]() ![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
EXPLAIN pokazuje:
Cytat id = 2 select_type = DEPENDENT SUBQUERY table = M type = ALL possible_keys = ID_transport,ID_transport_2 key = NULL key_len = NULL ref = NULL rows = 28735 Extra = Using where Podzapytanie:
Indeksy dla tabeli m_miejsca: Pierwszy: ID_transport Drugi: ID_transport + Miejsce ![]() -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Nie ma się co dziwić, że zapytanie działa tak długo, ponieważ sprawdza setki kombinacji, zanim trafi na odpowiedni zbiór pogrupowanych miejscowości. Jest po prostu trochę źle napisane:
Nie wiem czemu ma służyć sortowanie, ale dopisać nie będzie trudno. Grupujemy i łączymy tylko te rekordy, których M.ID_transport jest zgodne z T.ID_t. PS1: Usunąłem część odpowiedzi, bo brzmiała dwuznacznie, tzn. można ją było dwuznacznie zrozumieć. PS2: Teraz tak patrzę i widzę, że różnica jest niewielka. Zastanawiam się tylko, po co Ci DISTINCT w podzapytaniu i dlaczego te tabele są połączone relacją jeden do wielu. Wydawać by się mogło, że do tego potrzebne są trzy tabele i relacja wiele do wielu, ale to zależy od założeń aplikacji. Ten post edytował mortus 2.04.2013, 20:33:48 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Zmieniłem - teraz działa 16 sekund :/
Dokładnie to wygląda teraz tak:
Przeniosłem "M.ID_Transport = T.ID_t" z HAVING do WHERE i jest lepiej - 4sekundy, ale nadal kiepsko :/ Ten post edytował TomASS 2.04.2013, 20:41:32 -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
spróbuj tak:
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Nic
![]() -------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Od razu trzeba było powiedzieć, że takiego kolosa testujesz, bo takie wyniki przy pierwszym podanym przez Ciebie zapytaniu i 100 rekordach w moich oczach były po prostu niemożliwe. Z DISTINCT to jest tak, że w przypadku posortowanego zbioru danych (ORDER BY) tworzona jest tabela tymczasowa i to z niej są wybierane rekordy bez duplikatów... stąd tak długi czas wykonywania zapytania. Z założenia DISTINCT ma służyć do wybrania rekordów bez powtórzeń, ale to samo można osiągnąć grupując powtarzające się rekordy według odpowiednich kolumn. DISTINCT to po prostu "specjalny przypadek GROUP BY". Zastanawia mnie tylko skąd założenie, że przy tak dużej ilości danych (gdzie każde T.ID_t powinno być unikalne) pojawią się duplikaty.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 17:25 |