Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czytanie dużej tabeli od tyłu
matisq
post
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 2.06.2008

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


Cześć,

Mam tabelę koło miliona rekordów. Każdy rekord zawiera pól. Chcę znaleźć NAJNOWSZY (czyli znajdujący się na końcu tablicy) wpis dotyczący czegoś tam i spełniający potrójny warunek
  1. SELECT * FROM bla WHERE bla1=1 AND bla2=2 AND bla3=3
I tu pojawia się problem. Próbowałem robić zapytanie
  1. SELECT * FROM bla WHERE bla1=1 AND bla2=2 AND bla3=3 ORDER BY id DESC LIMIT 1
No i takie zapytanie trwa ponad 20 sekund. Zatem spróbowałem innego podejścia. Sprawdzam ile rekordów ma tablica i parsuję je sobie z pomocą php żeby dostać to co chcę.
  1. <?php
  2. for($j=$num_value;$j>1;$j--){
  3.   pytanie sql; -> SELECT * FROM bla WHERE bla1=1 AND bla2=2 AND bla3=3 AND id=$j
  4. }
  5. ?>

Problem jest taki że część danych jest dość "daleko" od końca wię i to trwa koło 20 sekund dodatkowo obciążając system na prawie 100%!

Czy jest jakiś sposób na to?
Czy można parsować tabelę od tyłu używając samego sql?
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(matisq @ 3.02.2009, 16:33:43 ) *
Próbowałem robić zapytanie
  1. SELECT * FROM bla WHERE bla1=1 AND bla2=2 AND bla3=3 ORDER BY id DESC LIMIT 1
No i takie zapytanie trwa ponad 20 sekund.

Pole id jest oczywiście kluczem głównym, prawda? Na kolumny bla1, bla2, bla3 założone są indeksy?
Go to the top of the page
+Quote Post
matisq
post
Post #3





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 2.06.2008

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


dokładnie tak
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  1. EXPLAIN SELECT * FROM bla WHERE bla1=1 AND bla2=2 AND bla3=3 ORDER BY id DESC LIMIT 1

Co ci zwraca?
Go to the top of the page
+Quote Post
matisq
post
Post #5





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 2.06.2008

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


  1. mysql> EXPLAIN SELECT * FROM service_data WHERE host_id="30" AND service_id="3" ORDER BY id LIMIT 1 ;
  2. +----+-------------+--------------+------+------------------------------+---------+---------+-------------+------+-----------------------------+
  3. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
  4. +----+-------------+--------------+------+------------------------------+---------+---------+-------------+------+-----------------------------+
  5. | 1 | SIMPLE | service_data | ref | host_id,host_id_2,service_id | host_id | 8 | const,const | 762 | USING WHERE; USING filesort |
  6. +----+-------------+--------------+------+------------------------------+---------+---------+-------------+------+-----------------------------+
  7. 1 row IN SET (0.07 sec)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 20:25