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




Powiem jak ja to robię:
klucz główny w postaci ID staram sie jednak zawsze dla tabeli zachować. No chyba, że naprawdę, naprawdę nie jest mi to potrzebne, wówczas klucz główny robię z innych pól. Zdarzyło mi się to tylko parę razy

Cytat
powinienem złożony klucz na id_uzyt,data jako unique nałożyc? (nie ma id_uzyt i daty w tej kombinacji powtarzającej się) i usunąć klucz primary auto increment z ID i całe pole wywalić?
jeżeli faktycznie te dwa pola dokładnie identyfikują rekord, to możesz ID wywalić. A z tych dwóch masz zrobić PRIMARY KEY a nie uniq - uniq będzie w domysle PRIMARY.
Pamiętaj tylko, że jak będziesz kiedyś chciał napisać panel do zarządzania historią, to usuwanie rekordu będzie polegać na podaniu dwóch wartości zamiast jednej ID.
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 - 20:31