![]() |
![]() ![]() |
![]() |
![]()
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)
problem: polecany wszędzie sposób pobierania ostatniego rekordu:
czyli żebym otrzymał wynik - musi przeskanować cała tablice... inny sposób:
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) :
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
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Jeżeli Ci się chce to dopisz ten cache, jeżeli nie, to 1 sposób i nie masz się nad czym zastanawiać.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#3
|
|
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?
![]() ![]() -------------------- gragieldowa.pl
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
2 sposób nie robi nic innego, albo w mysql wyszukaj jakiś tablic konfiguracyjnych które przetrzymują pewne informacje o tabelach. I tam może znajdziesz ostatni dodany rekord.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Po pierwsze: skoro chcesz pobrać ostatni rekord to w pierwszym wariancie nie ASC a DESC
Po drugie: pierwszy wariant jest ok. Czasami gdy jest mało rekordów to dla mysql jest szybciej przelecieć po nich niż bawić się w indeksy. Sam często widzę coś takiego. Gdy liczba rekordów wzrasta to mysql korzysta już z indeksów. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 73 Pomógł: 4 Dołączył: 13.01.2004 Skąd: Bielsko-Biała Ostrzeżenie: (0%) ![]() ![]() |
to już taki detal:P tak na marginesie wyciagajac pierwszy rekord skanuje cala tablice - tez masakra;/
ale przy desc jest jeszcze gorzej
tutaj zapytanie na tablicy z ~50k rekordów - nadal chce skanowac wszystkie (klucz jest na id_uzyt - primary, tablice posortowalem / zoptymalizowalem/zdefragmentowalem przed wykonaniem tego zapytania
no i 600k dalej przynajmniej w przypadku explain - nie potrafi posluzyc sie indexem
wrzucajac po select cos innego niz tylko id_uzyt/id - znika z ostatniej kolumny "using index" PS edycja tego postu i jego zapis = totalny rozwał... ![]() Ten post edytował ChrisB 30.08.2010, 09:52:36 -------------------- gragieldowa.pl
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Kurde, dziwne... No mam indentczyną sytuację, z tym ze, w rows wpisuje mi 1
![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 73 Pomógł: 4 Dołączył: 13.01.2004 Skąd: Bielsko-Biała Ostrzeżenie: (0%) ![]() ![]() |
może coś źle robię z indexami... już ogolnie ręce mi przy tym explain opadają
![]()
pełna struktura tablicy i tu jeszcze mam inne pytanie - zakładając że NIGDY nie będę chciał wybierać rekordów z tej tablicy po id - powinienem go usunąć i zostawić tablicę bez klucza głównego? (wybieram dane tylko po dacie lub id_uzyt) -------------------- gragieldowa.pl
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
struktura jest ok. Wstawiłem ją do siebie i lata po jednym rekordzie. Baze masz jakąś zrąbaną
![]() Cytat i tu jeszcze mam inne pytanie - zakładając że NIGDY nie będę chciał wybierać rekordów z tej tablicy po id - powinienem go usunąć i zostawić tablicę bez klucza głównego? (wybieram dane tylko po dacie lub id_uzyt) Klucz główny powinien być zawsze. Może to być ID, moze to być klucz składający się z kilku pól, ale ich zestawienie ma dawać unikalność rekordu -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 73 Pomógł: 4 Dołączył: 13.01.2004 Skąd: Bielsko-Biała Ostrzeżenie: (0%) ![]() ![]() |
i nie jest to jedyny problem z indexami jaki mam;/ przy wybieraniu danych z where po indexie - w paru innych przypadkach tez skanuje wszystko jak leci;/
ten w tym temacie najczęściej występuje i jest najprostszy dlatego chciałem od niego zacząć to stoi na vps z mysql 5.0.67 bodajże, z własnymi ustawieniami my.cnf - może coś tam mam źle... zauważyłem też naprawdę spore wartości Handler_read_rnd_next (Liczba żądań odczytu następnego rekord w pliku z danymi. Wartość jest duża przy wykonywania wielu przeszukiwań tabeli. Ogólnie sugeruje to, że tabele nie są poprawnie zindeksowane lub że zapytania nie są napisane w sposób pozwalający skorzystać z istniejących indeksów.) co do indexów czyli zakładając że wybieram przewaznie dane z tej tablicy w formie where id_uzyt=XX and data >'yy' 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ć? i czy ten index będzie też wykorzystywany przy zapytaniach tylko na id_uzyt lub tylko na date - czy powinienem założyć 3 - id_uzyt/data(unique), id_uzyt(index), data(index) Ten post edytował ChrisB 30.08.2010, 10:10:12 -------------------- gragieldowa.pl
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 36 557 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. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 73 Pomógł: 4 Dołączył: 13.01.2004 Skąd: Bielsko-Biała Ostrzeżenie: (0%) ![]() ![]() |
jak usuwam to albo dla danego użytkownika (po id_uzyt) albo dla danego dnia (po dacie) więc ten id nie jest mi potrzebny - właściwie to dodałem go parę dni temu licząc że coś to polepszy właśnie dostęp do tej tabeli ale żadnego pozytywnego skutku nie zauważyłem
wieczorem jeszcze spróbuje go usunąć i dać primary po id_uzyt/dacie i zobaczę jakie to da efekty a wracając do głównego wątku - mój problem z brakiem użycia indexów może być spowodowany nieprawidłowymi ustawieniami w my.cnf? jak coś to mogę je potem wkleić całe... -------------------- gragieldowa.pl
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Cytat Klucz główny powinien być zawsze. g. prawda. -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@cojak nadwyraz rzeczowa argumentacja
![]() 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ł. ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#16
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@cojak nie wiem co chciałeś pokazać tym linkiem, ale jeśli chciałeś go użyć jako potwierdzenie swojej "super argumentacji" to nie wiem o co ci chodziło. W linku znalazłem taki tekst:
Cytat : każda tabela musi posiadać klucz główny, a wartości klucza głównego muszą być w ramach tabeli unikalne i nie równe NULL. W szczególności, zapobiega to wystąpieniu w tabeli powtórzeń wierszy. Może zaznacz tekst. o który tobie chodziło, bo naprawdę nie chce mi się tego czytać. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Nospor no przecież wytłuściłem Ci o czym masz czytać, złączenia naturalne poszukaj. I tabela równie dobrze może posiadać parę jako klucz główny, nie musi posiadać w cale klucza głównego, zależy co implementujesz.
Ten post edytował cojack 31.08.2010, 08:18:31 -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#18
|
|
![]() Grupa: Moderatorzy Postów: 36 557 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".
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Ja tylko stwierdzam że nie musi być klucza głównego jak nie jest potrzebny.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#20
|
|
![]() Grupa: Moderatorzy Postów: 36 557 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" ![]() 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 ![]() ![]() 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 ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.06.2025 - 04:19 |