![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 23.04.2003 Ostrzeżenie: (0%) ![]() ![]() |
Mam następujący problem.
Łącze 2 tabele: 1. zawiera główne dane itp i ma ID 2. zawiera powiązania pierwszej tabeli z trzecią tabelą: pola : ID, opcja_ID Trzecia tabela zawiera nazwy opcji, ale do wyszukiwania potrzebuje znajdować takie które mają te opcje zapisane i nie potrzebuje ich nazw wtedy wyświetlać. I problem polega na tym że potrzebuje wyszukiwać rekordy z tabeli 1 spełniające pewne tam kryteria, a dodatkowo spełniające opcje z powiązanej tabeli mam zapytanko :
to przykładowe zapytanie wyciąga wiersze z 1 tabeli które mają co najmniej zaznaczone opcje 50,34 i 35. Wiem że to zapytanie jest pokręcone ale do takiego doszłem. zapytanko działa, tylko dla 30000 rekordów w 1 tabeli i z miliona w drugiej to wykonuje sie 4 sekundy, a to trooche za dużo. Jakby ktoś miał jakiś pomysł jak to wyszukiwanie przyśpieszyć to byłbym bardzo wdzięczny ![]() z góry thx |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 69 Pomógł: 0 Dołączył: 22.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Jak na pytanie , w ktorym :
- laczysz 2 tabele - grupujesz dane - agregujesz dane - masz warunki na dane i ktore przerabia milion rekordow 4 sekundy to nie jest duzo. Nie popadajmy w skrajnosci - baza nie wykonuje prostego selecta, w zwiazku z czym nie mozna oczekiwac, ze przy takiej ilosci danych wykona zapytanie w ok. sekunde. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 121 Pomógł: 15 Dołączył: 19.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
4 sekundy to jednak troche za duzo jak na takie zapytanie.
hmm, skoro pobierasz tylko ID rekordow z pierwszej tabeli to po co wogole uzywasz inner joina, skoro pole ID masz tez w tabeli laczacej? nie prosciej tak:
a jesli chcesz pobrac jakies pola z pierwszej tabeli to sprobuj:
Dlaczego w klauzuli WHERE wt.opcja_ID = '50' OR wt.opcja_ID = '35' OR wt.opcja_ID = '34' zapisujesz wartosci pol opcja_id jako tekst a nie jako liczby? Mysql musi potem wykonac niepotrzebna kowersje. Jesli to nic nie pomoze to wklej tu wynik zapytania Twojego zapytania na poczatku dodajac fraze "EXPLAIN EXTENDED". Sporo informacji o optymalizacji zapytan znajduje sie MySQL Reference Manual http://dev.mysql.com/doc/refman/5.0/en/ Jesli masz zainstalowanego phpMyAdmin to przejrzyj dokladnie strone: Informacje o działaniu serwera. Ten post edytował osiris 21.08.2007, 10:36:36 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 23.04.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Dlaczego w klauzuli WHERE wt.opcja_ID = '50' OR wt.opcja_ID = '35' OR wt.opcja_ID = '34' zapisujesz wartosci pol opcja_id jako tekst a nie jako liczby? Mysql musi potem wykonac niepotrzebna kowersje. no dzienki. Wcześniej nie zwracałem na to uwagi, a jakieś ułamki ms można urwać ![]() a pobieram pare danych z pierwszej tabeli oprócz id. Przeglądam i sprawdzam optymalizacje ![]() Próbuje różnych dróg poprzez join i select - podselect; ewentualnie wchodzi w grę zapisywanie opcji po przecinku w głównej tabeli w jednej kolumnie. Bo nie chciałbym aby w miare wzrostu rekordów w tabelach wszystko zaczęło strasznie zwalniać :/ |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 19:54 |