![]() |
![]() |
![]()
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ść? -------------------- |
|
|
![]() |
![]()
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. |
|
|
![]()
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 -------------------- |
|
|
![]()
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. -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 06:22 |