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
I tabela równie dobrze może posiadać parę jako klucz główny,
A gdzie ja napisałem że nie może?

A pozatym ty mi napisałes "g.prawda" do odpowiedzi:
Cytat
Klucz główny powinien być zawsze.
Para to też klucz główny, wiec klucz istnieje. Sam to teraz mowisz, ze para moze byc kluczem głównym, więc sam sobie przeczysz słowami "g.prawda".
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: 28.12.2025 - 17:03