Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> LIMIT - optymalizacja zapytań po indeksie
armon
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 24.09.2009

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


Witam,

Czy
  1. SELECT pole FROM tabela WHERE id = 1 LIMIT 1

jest szybsze od
  1. SELECT pole FROM tabela WHERE id = 1


gdy id jest primary key lub też unique?

Wiem, że bez indeksu na pewno jest szybsze, ponieważ po znalezieniu jednego rekordu nie trzeba przeszukiwać następnych.

Lecz z indeksem unikalnym samo z siebie wynika, że to się już nie powtórzy? więc chyba nic nie przyspieszy?

Rozumiem, że z normalnym INDEX (bez unique), LIMIT 1 przyspiesza zapytanie?

Myślę nad ustawieniem w bazie danych login na klucz unique, oraz login i hasło na klucz złożony INDEX. Na samo hasło nie będę nakładał indeksu bo po co w końcu jakieś tam szansę powtórzenia ma.

Tak więc wybierają później
  1. SELECT id FROM tabela WHERE login = 'loginek' AND haslo = 'cryptedwhirlpoolthing' LIMIT 1


Najlepiej dodać do końca LIMIT 1 tak?

Ten post edytował armon 20.09.2011, 08:51:42
Go to the top of the page
+Quote Post
maly_swd
post
Post #2





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


jesli jest unique/primary to moim zdaniem nie ma znaczenia limit (bo i tak czyta to z klucza)

co do tego "SELECT id FROM tabela WHERE login = 'loginek' AND haslo = 'cryptedwhirlpoolthing' LIMIT 1"

to jesli masz na login unique/primary to nie ma opcji aby bylo 2 uzytkownikow z tym samym loginem a co za tym idzie nie moga byc 2 hasla. Wiec limit nie ma sensu


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
armon
post
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 24.09.2009

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


Cytat(maly_swd @ 20.09.2011, 09:56:07 ) *
to jesli masz na login unique/primary to nie ma opcji aby bylo 2 uzytkownikow z tym samym loginem a co za tym idzie nie moga byc 2 hasla. Wiec limit nie ma sensu


Ale jest opcja, że dwóch użytkowników będzie miało te same hasła, a różne loginy, a koniunkcja jest spełniona wtedy i tylko wtedy, gdy oba argumenty są prawdziwe.

Chcę uwzględnić tutaj optymalizację pod klucz złożony (nałożony na pole login I hasło), wybieramy nie tylko po loginie, ale również po haśle. Klucze złożone potrafią jeszcze bardziej przyspieszyć zapytanie.

Myślę, że baza po tym, że login jest unique, a hasło i login są kluczem złożonym nie może się domyślić faktu, że login i hasło W TYM SAMYM momencie są różne, więc dodanie LIMIT 1 chyba przyspieszy (co prawda nieznacznie, ale to zrobi?)

Ten post edytował armon 20.09.2011, 09:01:52
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




limit na pewno nie zaszkodzi ani nie spowolni więc poprostu dodaj jeśli wiesz, ze chcesz pobrać max 1 rekord.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
armon
post
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 24.09.2009

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


Cytat(nospor @ 20.09.2011, 10:05:10 ) *
limit na pewno nie zaszkodzi ani nie spowolni więc poprostu dodaj jeśli wiesz, ze chcesz pobrać max 1 rekord.


Mój plik będzie zajmował o 7 znaków w bajtach więcej z każdym takim zapytaniem ;P plik .php będzie musiał być dłużej czytany ;P

A tak na poważnie uruchomienie czegoś co jest niepotrzebne, nie zmienia faktu, że zostało to jednak uruchomione, czyli trzeba było wywołać kod jakiejś funkcji, nawet jeśli był tam warunek sprawdzający czy klucze nie są już unique etc., to trzeba było to sprawdzić i wywołać funkcję. Oczywiście to jest prawie nic, no ale przy milionach zapytań to jest coś wink.gif

Czyli nikt nie wie?
Go to the top of the page
+Quote Post
nospor
post
Post #6





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




Cytat
ój plik będzie zajmował o 7 znaków w bajtach więcej z każdym takim zapytaniem ;P plik .php będzie musiał być dłużej czytany ;P

A tak na poważnie uruchomienie czegoś co jest niepotrzebne, nie zmienia faktu, że zostało to jednak uruchomione, czyli trzeba było wywołać kod jakiejś funkcji, nawet jeśli był tam warunek sprawdzający czy klucze nie są już unique etc., to trzeba było to sprawdzić i wywołać funkcję. Oczywiście to jest prawie nic, no ale przy milionach zapytań to jest coś
Proszę Cię..... miej litość. A jeśli nie masz litości, to leć szybciutko kasuj wszystkie spacje, tabulatory, komentarze, skracaj nazwy wszystkich funkcji do max 3 znaków.

Cytat
Czyli nikt nie wie?
Zmierz czas z i bez i będziesz wiedział. Stwórz tylko wpierw dostatecznie dużą tablicę.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
armon
post
Post #7





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 24.09.2009

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


Cytat(nospor @ 20.09.2011, 10:33:48 ) *
Proszę Cię..... miej litość. A jeśli nie masz litości, to leć szybciutko kasuj wszystkie spacje, tabulatory, komentarze, skracaj nazwy wszystkich funkcji do max 3 znaków.

Zmierz czas z i bez i będziesz wiedział. Stwórz tylko wpierw dostatecznie dużą tablicę.


To pierwsze to było ironia, jednak rozkaz wywołania czegoś niepotrzebnie na pewno zabiera jakieś zasoby. Pozostaje mi przetestować.
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(nospor @ 20.09.2011, 10:05:10 ) *
limit na pewno nie zaszkodzi ani nie spowolni więc poprostu dodaj jeśli wiesz, ze chcesz pobrać max 1 rekord.

Jakiś czas temu zastanawiałem się jak działa LIMIT. Wydaje mi się, że wycina ze zbioru wynikowego pewną porcję danych. Najpierw wykonuje się zapytanie z warunkami i sortowaniem, a potem odpalany jest LIMIT. Jeśli tak jest to jakiś narzut (pewnie śmiesznie mały, ale jednak) będzie by zamiast od razu zwrócić dane to jeszcze wyciąć z nich żądaną porcję. Jeśli ktoś ma w tej dziedzinie wiedzę to proszę o info - chciałbym wiedzieć jak to działa, tak z czystej ciekawości.
Go to the top of the page
+Quote Post
nospor
post
Post #9





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




Akurat mam do testów dość sporą bazę i jednak wykonywanie zapytania z limit a bez jest znacznie szybsze. Na pewno najpierw muszą przejść warunki i sortowanie, bo bez tego limit nie miałby sensu, nie mniej jednak limit daje kopa więc jakoś to muszą wewnętrznie optymalizować.
Podkreślam jednak, iż stwierdzam tak na podstawie obserwacji a nie teoretycznej wiedzy.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
luckyps
post
Post #10





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


Caly czas mowimy o wyszukiwaniu w tabeli wiersza na podstawie kolumny ktora ma PK ?
Go to the top of the page
+Quote Post
nospor
post
Post #11





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




Akurat ja testowałem na różnych polach i z PK i z indeksem i bez


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
luckyps
post
Post #12





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


No to w takim przypadku limit na pewno pomaga smile.gif
Go to the top of the page
+Quote Post
maly_swd
post
Post #13





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


" że dwóch użytkowników będzie miało te same hasła, "

No pomysl, masz unique na uzytkowniku, wiec jesli login sie nie zgadza to mysql nie porownuje dalej hasla, co za tym idzie dostaniesz tylko to co spelnia 2 warunki czyli 1 uzytkownika

nospor-> ja sprawdzalem podobnie i jesli warunki dotyczna pola unique to limit nie dawal roznicy. Baza z 20mln wpisow.

Wiec pewnie tez zalezy od bazy (danych) i innych czynnikow, ale jesli limit nie szkodzi to czemu go nie dawac:)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
armon
post
Post #14





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 24.09.2009

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


Cytat(maly_swd @ 20.09.2011, 12:12:33 ) *
" że dwóch użytkowników będzie miało te same hasła, "

No pomysl, masz unique na uzytkowniku, wiec jesli login sie nie zgadza to mysql nie porownuje dalej hasla, co za tym idzie dostaniesz tylko to co spelnia 2 warunki czyli 1 uzytkownika

nospor-> ja sprawdzalem podobnie i jesli warunki dotyczna pola unique to limit nie dawal roznicy. Baza z 20mln wpisow.

Wiec pewnie tez zalezy od bazy (danych) i innych czynnikow, ale jesli limit nie szkodzi to czemu go nie dawac:)


Rzeczywiście pod warunkiem, że MySQL potrafi się domyślić po tym, że gdy na login jest nałożony indeks UNIQUE to pierwszy znaleziony rekord MUSI być jedynym, który mógłby spełnić koniunkcję. Nie uwzględniłem w moim rozumowaniu faktu, że MySQL ma to tak zoptymalizowane względem operatorów logicznych.
Go to the top of the page
+Quote Post

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 Aktualny czas: 20.08.2025 - 10:28