Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja i dobre nawyki
deha21
post
Post #1





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Potrzebuję zoptymalizować zapytania MySQL na swojej stronie. Od pewnego czasu, jako że popularność strony mocno wzrosła, serwer już nie daje rady i prawie codziennie przychodzi mi na maila powiadomienie o przekroczeniu limitu obciążenia MySQL - ponad 1800s/osobę. Administrator serwera poprosił o optymalizację skryptów. W MySQL-u tak mocno nie siedzę i nie za bardzo wiem jakie są dobre praktyki, które pomogą zoptymalizować działanie skryptów.

To co do tej pory udało mi się zrobić to:
- Nieco ograniczyć ilość zapytań
- Zmienić mysql_fetch_array na assoc (nie wiem czy to pomoże w optymalizacji)
- Zmienić mysql_num_rows na zapytanie z SELECT COUNT(*)

Co jeszcze mogę zrobić żeby odciążyć nieco MySQL-a? Linki do stron, artykułów o tej tematyce mile widziane. Sam nie znalazłem, tego czego szukałem.


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
gothye
post
Post #2





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


Poczytaj o INDEX'ach w Mysql oraz zacznij korzystać z EXPLAIN W zapytaniach SQL


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
Sephirus
post
Post #3





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Cytat
- Zmienić mysql_fetch_array na assoc (nie wiem czy to pomoże w optymalizacji)
- Zmienić mysql_num_rows na zapytanie z SELECT COUNT(*)


co do pierwszego popieram w pełni - co do drugiego nie do końca. Jeśli wykonujesz jakiś SELECT i używasz danych z niego pobranych to lepiej jest użyć mysql_num_rows niż stosować drugie zapytanie. Pomyśl o tym.

Zlinczują mnie za to ale masz tu link do mojego wpisu - to instrukcje w pigułce co do MySQL - nie da Ci to wszystkich odpowiedzi ale będziesz miał punkt zaczepienia wink.gif

HTH wink.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


1. INDEXY
2. stronicowanie (paginacja) danych
3. nie używanie *
4. mysql_slow.log
Go to the top of the page
+Quote Post
dżozef
post
Post #5





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


- używaj PDO
- do zliczania:
  1. $sql = "SELECT count(id) FROM `table` WHERE foo = bar";
  2. $result = $con->prepare($sql);
  3. $result->execute();
  4. $number_of_rows = $result->fetchColumn();

- nie używaj *


--------------------
Go to the top of the page
+Quote Post
deha21
post
Post #6





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Cytat(dżozef @ 17.06.2013, 09:50:02 ) *
- używaj PDO
- do zliczania:
  1. $sql = "SELECT count(id) FROM `table` WHERE foo = bar";
  2. $result = $con->prepare($sql);
  3. $result->execute();
  4. $number_of_rows = $result->fetchColumn();

- nie używaj *

1. PDO jest szybsze? Mogę użyć zwyczajnie "SELECT COUNT(id) as SUMA FROM table WHERE pole='jakieś tam'"
2. Jeśli chodzi o INDEXy to stosuję PRIMARY przy ID. Potem w wolnej chwili doczytam o reszcie INDEXów.
3. O co chodzi ze paginacją danych? Paginację to ja stosuję ale przy listowaniu np. wpisów smile.gif Chodzi mi o np. LIMIT 5,10
4. Jeśli chodzi o mysql_slow.log to niestety nie mam do niego dostępu (zwyczajny hosting). Chyba, że jest jakiś sposób na wyciągnięcie tego pliku? (administrator niestety nie chce przesłać)

Jeszcze mam jedno pytanie. Lepszym (szybszym?) rozwiązaniem jest:
  1. mysql_query("SELECT * FROM tabela WHERE pole='$zmienna' ");
czy
  1. mysql_query("SELECT * FROM tabela WHERE pole='".$zmienna."' ");


Ten post edytował deha21 19.06.2013, 16:51:18


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





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
1. PDO jest szybsze? Mogę użyć zwyczajnie "SELECT COUNT(id) as SUMA FROM table WHERE pole='jakieś tam'"

Ogólnie, to zależy - jeśli korzystasz z prepared statements, to w przypadku np. insertów w pętli różnica jest spora, bo można wykorzystać mapowanie pamięci.

Cytat
2. Jeśli chodzi o INDEXy to stosuję PRIMARY przy ID. Potem w wolnej chwili doczytam o reszcie INDEXów.

ohmy.gif I dziwisz się, że wolno chodzi? ohmy.gif

Cytat
4. Jeśli chodzi o mysql_slow.log to niestety nie mam do niego dostępu (zwyczajny hosting). Chyba, że jest jakiś sposób na wyciągnięcie tego pliku? (administrator niestety nie chce przesłać)

Postaw sobie lokalną kopię i użyj EXPLAIN wobec wszystkich zapytań.

Cytat
Jeszcze mam jedno pytanie. Lepszym (szybszym?) rozwiązaniem jest:

To jest kosmetyczna optymalizacja, na poziomie parsera.


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
deha21
post
Post #8





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


erix, co postawić przy ID? PRIMARY według mnie (tongue.gif) wydaje się sensowy, a i czas wykonywania go przez MySQL jest krótki.

Poczytałem o INDEX'ach i co nieco wiem. Większośc materiałów jednak nie tłumaczy do końca jaki index gdzie i jak stosować (albo po prostu ja jestem taki tępy)...

Powiedzmy, że na stronie wyświetlam np. 20 rekordów które sortuje po polu POZYCJA. Wtedy do pola POZYCJA dodaję INDEX, tak? Użyłem EXPLAIN i rzeczywiście pokazuje, że po nadaniu INDEX'u szuka tylko w 20 rekordach a nie w ponad 4000, które mam. Tak więc przy nadawaniu INDEX'ów kierować się po prostu czasem wykonywania zapytania i liczbą przeszukiwanych rekordów? Hmm to wydaje się proste wink.gif

EDIT: Coś dziwnego mi się stało. Na lokalnym serwerze po dodaniu INDEX'u w pewnym zapytaniu, w EXPLAIN wyskakuje mi ROWS=3 - czyli dobrze. Natomiast na właściwym serwerze dalej ROWS=600. Mimo, że jest to dokładna kopia bazy.

Ten post edytował deha21 19.06.2013, 22:41:13


--------------------
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
erix, co postawić przy ID? PRIMARY według mnie

Miałem na myśli drugą część zdania. tongue.gif

http://schimpf.es/mysql-explain-tutorial/


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
deha21
post
Post #10





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Cytat(erix @ 20.06.2013, 13:32:39 ) *
Miałem na myśli drugą część zdania. tongue.gif
http://schimpf.es/mysql-explain-tutorial/

Ahhh ok smile.gif No, można powiedzieć że dodałem indeksy i szybkość zapytań znacznie wzrosła w niektórych przypadkach. Czytałem, że INDEX'y jednak mogą zajmować dużo miejsca na dysku i nie warto tworzyć ich nie wiadomo ile. Czy oprócz zajmowania dysku robią coś nie dobrego? Miejsca na serwerze jeszcze mam więc w sumie ich waga mi wisi póki co tongue.gif Jak na razie, najwięcej ważące INDEX'y mają w jednej tabeli 600KB, ale to pewnie dlatego że mam tam dwa FULLTEXT'y.

Ten post edytował deha21 20.06.2013, 17:21:35


--------------------
Go to the top of the page
+Quote Post
erix
post
Post #11





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Czytałem, że INDEX'y jednak mogą zajmować dużo miejsca na dysku i nie warto tworzyć ich nie wiadomo ile. Czy oprócz zajmowania dysku robią coś nie dobrego?

Z tego, co wiem, to nie. Po prostu leżą na dysku i ew. DBMS sprawdza, czy może użyć danego indeksu na pola.

Wagą bym się nie przejmował.

A jeśli FULLTEXT okazałby się za wolny - polecam coś w rodzaju Sphinksa.


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
michaJlS
post
Post #12





Grupa: Zarejestrowani
Postów: 83
Pomógł: 9
Dołączył: 21.05.2004
Skąd: Glogau/Breslau

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


Cytat(erix @ 21.06.2013, 13:27:01 ) *
Z tego, co wiem, to nie. Po prostu leżą na dysku i ew. DBMS sprawdza, czy może użyć danego indeksu na pola.

Wagą bym się nie przejmował.

A jeśli FULLTEXT okazałby się za wolny - polecam coś w rodzaju Sphinksa.


Oprócz zajmowania miejsca, trzeba je jeszcze przy zapisie danych zaktualizować, przeliczyć, dlatego należy szukać złotego środka i nie dodawać takich, z których się nie korzysta albo korzysta się bardzo rzadko.
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Yup, racja, skleroza nie boli. [;


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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 - 15:44