Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> index podzapytania
nospor
post
Post #1





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




Hejka, mam taką zagwostkę:
Jest sobie zapytanie:
  1. SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM f_post WHERE FK_TOPIC=2 ORDER BY f_post.ID ASC

No i ładnie mi bierze index FK_TOPIC.
Explain:
Cytat
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1 SIMPLE f_post ref FK_TOPIC FK_TOPIC 4 const 2 Using where; Using filesort
Wziął mi pod uwagę dwa rekordy.

Daję teraz to w podzapytanie:
  1. SELECT @idnr AS nr FROM
  2. (SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM f_post WHERE FK_TOPIC=2 ORDER BY f_post.ID ASC ) podsel WHERE podsel.ID = @id;

I już mi nie uwzględnia FK_TOPIC jako klucza
Cytat
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1 PRIMARY <derived2>ALL(NULL)(NULL)(NULL)(NULL)2Using where
2 DERIVED f_post ALL FK_TOPIC FK_TOPIC 4 118 Using filesort

Bierze pod uwagę wszystkie rekordy (118)

O co chodzi?Mam chwilowe zaćmienie związane z poszukiwaniem samochodu (IMG:style_emoticons/default/smile.gif)

ps: wystarczy ze wywalę ORDER BY ID asc i już gra jak ta lala, szuka po dwóch rekordach.
Czemu normalnie dziala niezależnie od order by, a w podzapytaniu trzeba wywalic order by by poszło normalnie
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Tabela
  1. CREATE TABLE `paginacja_test` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `pole` varchar(100) NOT NULL,
  4. `id_pomocnicze` int(11) NOT NULL,
  5. `pozycja` int(11) NOT NULL,
  6. PRIMARY KEY (`id`),
  7. UNIQUE KEY `id_pomocnicze_2` (`id_pomocnicze`,`pozycja`)
  8. );


Wypełniamy przykładowymi danymi
  1. $pdo->beginTransaction();
  2. $max = 1000;
  3. $id_pom = 1;
  4. $pozycja = 1;
  5. for ($i=0; $i<1000; $i++)
  6. {
  7. $pdo->query('INSERT INTO paginacja_test (pole, id_pomocnicze, pozycja) VALUES ("'.md5(rand(0, 1000000)).'", '.$id_pom.', '.$pozycja.')');
  8. if ($i%100 == 0) {
  9. $id_pom++;
  10. $pozycja = 1;
  11. } else {
  12. $pozycja++;
  13. }
  14. }
  15. $pdo->commit();


  1. EXPLAIN
  2. SELECT *
  3. FROM `paginacja_test`
  4. WHERE id_pomocnicze =5 AND pozycja BETWEEN 60 AND 79
  5. ORDER BY pozycja

Przeskanowanych rekordów 20

  1. EXPLAIN
  2. SELECT * FROM `paginacja_test`
  3. WHERE id_pomocnicze =5
  4. ORDER BY pozycja
  5. LIMIT 20
  6. OFFSET 60

Przeskanowanych rekordów 100

W zapytaniu z limit baza szuka wszystkich rekordów z id_pomocnicze = 5, sortuje a następnie odrzuca 60. Jeżeli do warunku dorzucimy dodatkowy warunek wyboru baza danych dzięki indeksowi nie musi znajdywać aż 100 rekordów.

Pozycja wygrywa (IMG:style_emoticons/default/smile.gif)

P.s. Wiem, że się czepiam ale cóż taki już jestem (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


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: 18.10.2025 - 10:04