![]() |
![]() |
![]()
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. -------------------- |
|
|
![]() |
![]()
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
|
|
|
![]()
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 ![]() HTH ![]() -------------------- 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... |
|
|
![]()
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 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 125 Pomógł: 9 Dołączył: 25.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
- używaj PDO
- do zliczania:
- nie używaj * -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 544 Pomógł: 5 Dołączył: 18.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
- używaj PDO - do zliczania:
- 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 ![]() 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: czy Ten post edytował deha21 19.06.2013, 16:51:18 -------------------- |
|
|
![]()
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. ![]() ![]() 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! |
|
|
![]()
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 (
![]() 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 ![]() 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 -------------------- |
|
|
![]()
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. ![]() 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! |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 544 Pomógł: 5 Dołączył: 18.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ahhh ok ![]() ![]() Ten post edytował deha21 20.06.2013, 17:21:35 -------------------- |
|
|
![]()
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! |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 83 Pomógł: 9 Dołączył: 21.05.2004 Skąd: Glogau/Breslau Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
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! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 15:44 |