Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ostatni rekord z tablicy - problem z optymalizacją
ChrisB
post 28.08.2010, 23:48:27
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?


--------------------
gragieldowa.pl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
ChrisB
post 29.08.2010, 11:26:42
Post #2





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

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


nie mam się co przejmować że robi mi full table scana i nie korzysta z kluczy? ohmy.gif tak na poważnie?ohmy.gif a co jak będę miał 100.000 rekordów tam lub i więcej


--------------------
gragieldowa.pl
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.06.2025 - 14:28