Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wybieranie użytkowników według ostatnich logowań
pitbull82
post
Post #1





Grupa: Zarejestrowani
Postów: 167
Pomógł: 0
Dołączył: 30.04.2004
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Witam

Sprawa teoretycznie prosta

Dla uproszczenia 2 tabele:

USER
id INT

LOGIN
id INT
id_user INT
date datetime


Chcę wybrać 100 ostatnio zalogowanych użytkowników wraz z datą logowania.

Teoretycznie sprawę powinno rozwiązać:

Kod
SELECT *, (SELECT max(date) FROM login WHERE id_user=u.id) AS 'max_date' FROM user u ORDER BY max_date DESC LIMIT 100


Dla małej bazy może rzeczywiście by się to sprawdziło ale ...

jeśli w tabeli user mamy 145360 rekordów, a w tabeli login 2774138 rekordów, zaczyna się mały problem...

Praktycznie nie starczyło mi nigdy cierpliwości, żeby zapytanie tego typu doprowadzić do końca - kilka minut na pewno nie wystarczy...


Rozumiem, że problem w tym wypadku może powodować ORDER, ale nawet kiedy pozbędę się ORDER BY, a zostawię samo limit 100, ba - nawet limit 1, czas oczekiwania na jakikolwiek rezultat jest niemiłosiernie długi.

Wersja MySQLa 4.1.22

Ma ktoś z Was pomysł jak to obejść?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
mhs
post
Post #2





Grupa: Zarejestrowani
Postów: 764
Pomógł: 3
Dołączył: 30.04.2003

Ostrzeżenie: (0%)
-----


Sprawdz takie zapytanie:

SELECT
u.id,
l.date
FROM
user u,
login l
WHERE
u.id = l.id_user
ORDER BY
date DESC
LIMIT 100

Sprawdź także:
czy na id oraz id_user są założone klucze (ewentualnie załóż) i sprawdziłbym też działanie takiego zapytania przy założonym kluczu na date.
Go to the top of the page
+Quote Post
pitbull82
post
Post #3





Grupa: Zarejestrowani
Postów: 167
Pomógł: 0
Dołączył: 30.04.2004
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Dla takiego zapytania dostaję #1030 - Got error 127 from storage engine

Poza tym,

Kod
EXPLAIN SELECT u.id, l.date
FROM user u, login l
WHERE u.id = l.id_user
ORDER BY date DESC
LIMIT 100


daje rezultat:

1 SIMPLE l ALL index1_aton NULL NULL NULL 2774138 Using filesort
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 baza.l.ID_user 1 Using index

Podczas gdy zapytanie z pierwszego posta (EXPLAIN) daje

1 PRIMARY u ALL NULL NULL NULL NULL 145360 Using filesort
2 DEPENDENT SUBQUERY login ref index1_aton index1_aton 4 baza.u.ID 47


Bezpośredniego indeksu na date nie ma, jest indeks na date + grupę innych pól.

Próbowałem nałożyć na samo date, ale trwało to strasznie długo i zatrzymałem - ta tabela ma ponad 600 MB

Ten post edytował pitbull82 27.02.2007, 21:47:21


--------------------
Go to the top of the page
+Quote Post
Norbas
post
Post #4





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


Cytat
Próbowałem nałożyć na samo date, ale trwało to strasznie długo i zatrzymałem - ta tabela ma ponad 600 MB

Będziesz musiał zbudować indeks na dacie, przecież możesz utworzyć indeks z konsoli. Chyba, że da się wykorzystać te pozostałe pola wykorzystane jako indeks w grupie, ale o tym już nic nie piszesz.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 06:22