Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ostatni rekord z tablicy - problem z optymalizacją
ChrisB
post
Post #1





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 13.01.2004
Skąd: Bielsko-Biała

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


witam jak w temacie potrzebuje pobrać ostatni rekord z tablicy

tablica to innodb z około 1k rekordów (w tym przypadku mała ale i prosta - mam też parę innych tabel gdzie jest więcej rekordów i ten sam problem)

  1. CREATE TABLE IF NOT EXISTS `statydzienne` (
  2. `ids` int(6) NOT NULL AUTO_INCREMENT,
  3. `data` date NOT NULL DEFAULT '0000-00-00',
  4. i tam pare innych pól które nie maja aktualnie znaczenia
  5. PRIMARY KEY (`ids`),
  6. KEY `data` (`data`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1037 ;


problem:

polecany wszędzie sposób pobierania ostatniego rekordu:
  1. mysql> EXPLAIN SELECT * FROM statydzienne ORDER BY ids ASC LIMIT 1;
  2. +----+-------------+--------------+-------+---------------+---------+---------+------+------+-------+
  3. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
  4. +----+-------------+--------------+-------+---------------+---------+---------+------+------+-------+
  5. | 1 | SIMPLE | statydzienne | INDEX | NULL | PRIMARY | 4 | NULL | 882 | |
  6. +----+-------------+--------------+-------+---------------+---------+---------+------+------+-------+
  7. 1 row IN SET (0.00 sec)
  8.  


czyli żebym otrzymał wynik - musi przeskanować cała tablice...

inny sposób:

  1. mysql> EXPLAIN SELECT * FROM statydzienne WHERE ids=(SELECT max(ids) FROM statydzienne);
  2. +----+-------------+--------------+-------+---------------+---------+---------+-------+------+------------------------------+
  3. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
  4. +----+-------------+--------------+-------+---------------+---------+---------+-------+------+------------------------------+
  5. | 1 | PRIMARY | statydzienne | const | PRIMARY | PRIMARY | 4 | const | 1 | |
  6. | 2 | SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | SELECT TABLES optimized away |
  7. +----+-------------+--------------+-------+---------------+---------+---------+-------+------+------------------------------+
  8. 2 rows IN SET (0.00 sec)



nie wiem czy lepiej bo nie do końca rozumiem tą drugą linijke:) ale przynajmniej z pierwszej wynika że tylko 1 wiersz skanuje - ten poprawny

opcja 3 to przechowywanie w tempie id ostatniego wiersza (jest on dodawany raz dziennie wiec w tym przypadku to nie jest problem) :
  1. mysql> EXPLAIN SELECT * FROM statydzienne WHERE ids=777;
  2. +----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+
  3. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
  4. +----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+
  5. | 1 | SIMPLE | statydzienne | const | PRIMARY | PRIMARY | 4 | const | 1 | |
  6. +----+-------------+--------------+-------+---------------+---------+---------+-------+------+-------+
  7. 1 row IN SET (0.00 sec)



którą drogą powinienem iść? (zakładam że 1 mogę pominąć, więc jest 2 którą pod względem optymalności nie do końca rozumiem, lub 3 - dla której cachowanie trzeba by dopisac)

czy może są lepsze metody?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





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




Cytat
Ja tylko stwierdzam że nie musi być klucza głównego jak nie jest potrzebny.
To jest tylko ładniej napisane "g.prawda" (IMG:style_emoticons/default/smile.gif)
Zacytuję ci odpowiedż jaką ci dałem na "g.prawda"
Cytat
Wiem, że bez klucza głównego tabela może "żyć". Jednak dla własnego dobra, nawet jesli w danej chwili go nie widzisz, dobrze jest by klucz główny był.
I mówię ci to na podstawie zawodowego doświadczenia (IMG:style_emoticons/default/smile.gif) Też czasem nie używam klucza głównego, zdarza się to sporadycznie i tylko wówczas gdy naprawdę, naprawdę, naprawdę nie jest konieczne (IMG:style_emoticons/default/smile.gif)

edit: po przeczytaniu tego wszystkiego jeszcze raz po części się z tobą zgodzę. Źle to napisałem
Powinienem był napisać "W większości przypadków powinien być zawsze" (tak miałem w domyśle - mój błąd).Większość używanych przez nas tabel powinna mieć klucz główny. Oczywiście zdarzają się odstępstwa gdzie ten klucz niczemu służyć nie będzie.
Twoja cudna argumentacja "g.prawda" niestety zadziałała na mnie jak płachta na byka. Twoje ostatnie zdanie już jest "lepiej" sformułowane i "zmusiło" mnie do ponownego przetrawienia treści (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Posty w temacie
- ChrisB   ostatni rekord z tablicy - problem z optymalizacją   28.08.2010, 23:48:27
- - cojack   Jeżeli Ci się chce to dopisz ten cache, jeżeli nie...   29.08.2010, 08:41:44
- - ChrisB   nie mam się co przejmować że robi mi full table sc...   29.08.2010, 11:26:42
- - cojack   2 sposób nie robi nic innego, albo w mysql wyszuka...   30.08.2010, 08:01:15
- - nospor   Po pierwsze: skoro chcesz pobrać ostatni rekord to...   30.08.2010, 08:58:00
- - ChrisB   to już taki detal:P tak na marginesie wyciagajac p...   30.08.2010, 09:38:47
- - nospor   Kurde, dziwne... No mam indentczyną sytuację, z ty...   30.08.2010, 09:47:45
- - ChrisB   może coś źle robię z indexami... już ogolnie ręce ...   30.08.2010, 09:54:30
- - nospor   struktura jest ok. Wstawiłem ją do siebie i lata p...   30.08.2010, 09:58:03
- - ChrisB   i nie jest to jedyny problem z indexami jaki mam;/...   30.08.2010, 10:07:58
- - nospor   Powiem jak ja to robię: klucz główny w postaci ID ...   30.08.2010, 10:14:55
- - ChrisB   jak usuwam to albo dla danego użytkownika (po id_u...   30.08.2010, 11:17:37
- - cojack   CytatKlucz główny powinien być zawsze. g. prawda.   30.08.2010, 14:42:33
- - nospor   @cojak nadwyraz rzeczowa argumentacja Wiem, że be...   30.08.2010, 18:43:56
- - cojack   Złączenia naturalne: http://bobo.fuw.edu.pl/DB/OL...   30.08.2010, 20:56:08
- - nospor   @cojak nie wiem co chciałeś pokazać tym linkiem, a...   31.08.2010, 06:13:03
- - cojack   Nospor no przecież wytłuściłem Ci o czym masz czyt...   31.08.2010, 08:17:16
- - nospor   CytatI tabela równie dobrze może posiadać parę jak...   31.08.2010, 08:21:22
- - cojack   Ja tylko stwierdzam że nie musi być klucza główneg...   31.08.2010, 10:03:15
- - nospor   CytatJa tylko stwierdzam że nie musi być klucza gł...   31.08.2010, 10:07:36
- - cojack   To ja też przepraszam, za swoje słownictwo ;/   31.08.2010, 12:55:17


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: 29.12.2025 - 00:37