![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Mam takie tabele
Mamy tabelę wiadomości oraz tabelę wiążącą, która mówi, że tę wiadomość może zobaczyć taki a taki user. Wiadomość może też widziec ten, kto ją utworzył (FK_CUSER) No i mam zapytanie pobierające wiadomosci
Czyli pobieram wiadomosci jakie może widziec użytkownik 4 W bazie mam 500tys rekordów. Wszystko smiga do czasu dodania OR cmu.FK_USER IS NOT NULL czyli sprawdzeniu tabeli wiążącej. EXPLAIN daje: Kod id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE cm index FK_MESSAGE,FK_CUSER FK_LAST_MESSAGE 4 \N 35 Using where 1 SIMPLE cmu eq_ref PRIMARY PRIMARY 8 cm.ID,const 1 Using where; Using index Gdy dodam tego OR to zapytanie wykonuje się 2 sekundy. Idzie jakoś to przyspieszyc? Nie widzę za bardzo jakie mam tu dodać dodatkowe indeksy. Przed chwilą wpadłem na pomysł, że wystarczy iż zamienie cm.FK_CUSER = 4 OR cmu.FK_USER IS NOT NULL na cmu.FK_USER IS NOT NULL czyli wywale sprawdzanie autora wiadomosci, a autora dodam do tabeli wiążącej. Wówczas zapytanie znowu śmiga. Wolałbym jednak tego rozwiązania nie stosować.
Powód edycji: [nospor]:
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
FORCE INDEX rzeczywiście przyspieszyło zapytanie. Aczkolwiek dla pewnych warunków danych. Trzeba by się pobawić i dobrać optymalne. Nie mniej jednak FORCE INDEX nie rozwiązał całkowicie problemu, gdyż nadal za wolno dane się szukały.
Na UNION wpadłem przed Twoim postem. Potestowałem i dalo zadowalające wyniki. Chyba więc zostanę przy UNION, szczególnie gdyż będę miał jeszcze kilka złączeń i warunków oprócz tych co tu podałem. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 27.09.2025 - 02:43 |