Skocz do zawartości

Witaj na forum webmasterów Webax.pl.

Wyświetl nową zawartość

Prosty trick na optymalizację zapytania MySQL

mysql optymalizacja

  • Zaloguj się, aby dodać odpowiedź
7 odpowiedzi w tym temacie
SerwerStatus.pl
SerwerStatus.pl

    Stały bywalec

  • Moderator
  • 260 postów
#1

Napisano 16 maj 2013 - 10:55

Wielu młodych ludzi, którzy z reguły sami się uczą programowania napotyka pytanie - "Jak można zoptymalizować mój kod". Otóż przedstawię krótki i zapewne wielu znany sposób na optymalizację zapytania do MySQL.

 

Przykładowo mamy tabelę gdzie jest 100 000 rekordów. Ale powiedzmy wybieramy użytkownika z bazy, gdyż jest to powiedzmy baza użytkowników. Używamy do tego np. zapytania typu SELECT.

 

 

 

SELECT * FROM `uzytkownicy` WHERE `login` = '$login'

 

Co spowoduje to zapytanie? Przeszukanie CAŁEJ tabeli w poszukiwaniu danego loginu. Ale gdy jesteśmy pewni że jest tylko 1 użytkownik o danym loginie to po co mamy przeszukiwać całą tabelę co zajmuje dużo czasu zwłaszcza przy dużym ruchu? Powyższe zapytanie przeszukuje od początku do końca całą tabelę nawet pomimo tego że nasz login może być pierwszy na liście (i tak przeszuka całość).

 

Dlatego możemy ograniczyć nasze zapytanie

 

 

SELECT * FROM `uzytkownicy` WHERE `login` = '$login' LIMIT 0,1

Co spowoduje zapis LIMIT 0,1? Otóż gdy zapytanie napotka spełnienie warunku od razu zakończy przeczesywanie tabeli i dzięki temu skorzystamy na czasie (nie musimy czekać na przeszukanie całej tabeli).

 

 

 

 

Wkrótce nowe poradniki dla początkujących :)

 

 

 

 

 


  • 2

raf
raf

    Użytkownik

  • Użytkownik
  • PipPip
  • 21 postów
#2

Napisano 30 maj 2013 - 17:40

SELECT * FROM `uzytkownicy` WHERE `login` = '$login'
 Co spowoduje to zapytanie? Przeszukanie CAŁEJ tabeli w poszukiwaniu danego loginu.

Wiem że krytykować ludzi którzy chcą dobrze jest źle, ale to jest rada pokroju "Jak gotowałeś benzynę w garnku i zapali ci się kuchnia to dzwoń po straż."Prawidłowe rozwiązanie problemu to nadać kolumnie login unikalny indeks. Wtedy odczyt z tabeli staje się szybki bo zamiast częściowego skanu tabeli MySQL wykorzystuje indeksy a z tych wyczyta że jest maksymalnie jeden poprawny wynik dla klauzuli equals.Jako bonus masz gwarancję że MySQL nigdy nie pozwoli na utworzenie dwóch kont z takim samym loginem
  • 0

Tomasz Gąsior
Tomasz Gąsior

    Początkujący

  • Aktywny
  • 139 postów
#3

Napisano 31 maj 2013 - 11:24

@raf, ten poradnik jest dla początkujących, a, w moim odczuciu, twoja metoda jest już dla bardziej zaawansowanych w kwestii MySQL, dlatego owy poradnik jak najbardziej mi się podoba. Tylko zmienił bym tytuł tego wątku na "Proste tricki w MySQL" i wszystkie kolejne opisywał w jednym miejscu.
  • -1

SerwerStatus.pl
SerwerStatus.pl

    Stały bywalec

  • Moderator
  • 260 postów
#4

Napisano 31 maj 2013 - 16:29

Ale tutaj login to podałem przykładowo. Stosować tą zasadę można do różnych typów danych i tabel, ale nie chciało mi się myśleć i komplikować ludziom - początkującym podstaw bo mija się to w tedy z celem.

 

Jasne indeksy są ważne przy optymalizacji, ale to może opiszę później w innym tutku :)

 

Na razie nie mam czasu nic napisać bo co chwila ktoś coś chce ode mnie hehe :)


  • 0

raf
raf

    Użytkownik

  • Użytkownik
  • PipPip
  • 21 postów
#5

Napisano 31 maj 2013 - 16:30

"Optymalizacja" z LIMIT 1 jest widoczna tylko w przypadku wierszy na początku tabeli. Jeśli wiersz jest na pozycji 99000 ze 100000 (a to jest najczęstsza sytuacja w aplikacjach webowych gdzie częściej serwuje się nowe wpisy) MySQL i tak i tak zrobi table scan, co podważa zasadność podstawowego argumentu za tą zmianą: uniknięcie table scanu.

Indeksy nie są zaawansowanym zagadnieniem, to jedna z podstaw. Używasz kolumn w WHERE/ORDER albo JOIN? Utwórz indeks. Zawartość kolumny nie może się powtarzać? Utwórz indeks unikalny. Podziękujesz mi później.

Zaawansowanymi zagadnieniami jest współbieżność i internalsy query optimizera a nie do czego służą indeksy.


Uczenie złych nawyków nigdy nie jest okey, zwłaszcza nowicjuszy! Powiem więcej, to jest szkodliwa mentalność która ostatecznie skutkuje taką a nie inną opinią o ludziach pracujących w PHP i MySQL - Że są to skrytopklepacze którzy są zbyt super aby zainteresować się zagadnieniami z których powinni regularnie korzystać przy pracy, ignoranckimi bądź nieświadomymi niuansów technologii których znajomość deklarują.

Ale tutaj login to podałem przykładowo. Stosować tą zasadę można do różnych typów danych i tabel, ale nie chciało mi się myśleć i komplikować ludziom - początkującym podstaw bo mija się to w tedy z celem.

Red herring + pacz wyżej. "Nie komplikować nowicjuszom" to nie jest poprawny argument, to bardzo zły argument. Wciska się ludziom którzy nie wiedzą lepiej złe rozwiązania.

Jasne indeksy są ważne przy optymalizacji, ale to może opiszę później w innym tutku :)

Pisz pisz, zobaczymy co z tego wyjdzie. :)
  • 0

SerwerStatus.pl
SerwerStatus.pl

    Stały bywalec

  • Moderator
  • 260 postów
#6

Napisano 31 maj 2013 - 20:58

Indeksy nie są zaawansowanym zagadnieniem, to jedna z podstaw. Używasz kolumn w WHERE/ORDER albo JOIN? Utwórz indeks. Zawartość kolumny nie może się powtarzać? Utwórz indeks unikalny. Podziękujesz mi później.

 

Sugerujesz żebym ja używał indexów? Ja mam wszędzie praktycznie indeksy porobione i dzięki temu moje bazy się nie "zapowietrzają" że tak powiem (chodzi mi o zarżnięcie serwera) :)

 

Powiem więcej, to jest szkodliwa mentalność

 

Wiesz no nie chcę Cię obrażać, ale najłatiwej jest krytykować, ale nikt nie chce poświęcić 15-20 minut czasu na napisanie poradników a że miałem chwilę czasu a ten sposób testowałem ostatnio to miałem go można powiedzieć na gorąco.

 

Ja zawsze polecam komuś jakąś dobrą książkę do nauki, ale że społeczeństwo robi się coraz bardziej leniwe (wiem po sobie :) ) to obczają pierwszy lepszy poradnik. Użyją magicznych kombinacji ctrl+c / v i gotowe :)

 

Ja staram się pisać tak poradniki żeby gościu czytający - może raczej, który szuka pomocy to ruszy głową i przeczyta całość zanim skopiuje wszystko na żywca i zacznie sobie coś tam klikać.


  • 0

raf
raf

    Użytkownik

  • Użytkownik
  • PipPip
  • 21 postów
#7

Napisano 31 maj 2013 - 23:03

Wiesz no nie chcę Cię obrażać, ale najłatiwej jest krytykować.

A w odpowiedzi na krytykę najłatwiej jest uciec do "ja poświeciłem czas a ty nie, więc nie krytykuj". :)

Ja zawsze polecam komuś jakąś dobrą książkę do nauki, ale że społeczeństwo robi się coraz bardziej leniwe (wiem po sobie :) ) to obczają pierwszy lepszy poradnik. Użyją magicznych kombinacji ctrl+c / v i gotowe :)Ja staram się pisać tak poradniki żeby gościu czytający - może raczej, który szuka pomocy to ruszy głową i przeczyta całość zanim skopiuje wszystko na żywca i zacznie sobie coś tam klikać.

To bardzo dobrze, szkoda że zabrakło tego w pierwszym poście.
  • 0

SerwerStatus.pl
SerwerStatus.pl

    Stały bywalec

  • Moderator
  • 260 postów
#8

Napisano 31 maj 2013 - 23:46

Oj bo też tak na szybko. Normalnie moja doba jest za krótka żeby i pomagać innym i rozwijać swój non-profit jak i zajmować się serwerami i własnym garażem że tak powiem gdzie dzisiaj spędziłem kilka godzin ogarniając nowy serwerek :)


  • 0





Również z jednym lub większą ilością słów kluczowych: mysql, optymalizacja