Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Poprawienie wydajności bazy
Gruchol
post 12.02.2015, 21:54:36
Post #1





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


Witam,
Na wstępie chciałbym powiedzieć że jestem zielony jeżeli chodzi o linuxa i prosiłbym o pisanie jak najbardziej zrozumiale.
Posiadam sporą bazę MySQL która strasznie przymula.
Uruchomiłem MySQLTuner który pokazał mi coś takiego :
http://wklej.org/id/1633653/
Szukałem tych linijek w my.cnf
tmp_table_size (> 16M)
max_heap_table_size (> 16M)
Jednak ich nie znalazłem.
Proszę o wyjaśnienie jak najprościej się da co mogę zrobić aby poprawić wydajność.
Pozdrawiam.

@edit
Dopisałem to do my.cnf
tmp_table_size = 16M
max_heap_table_size = 16M
I teraz ten komunikat na samym dole zniknął.
Co jeszcze mogę zrobić ?

Ten post edytował Gruchol 12.02.2015, 22:26:37
Go to the top of the page
+Quote Post
aniolekx
post 13.02.2015, 08:14:21
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


tak naprawdę to nie wiadomo co oznacza przymula, wiesz jak masz bazę na kiepskiej maszynie to może tu jest problem smile.gif
pyzatym zawsze możesz sprawdzić jakie zapytania trwają najdłużej, może brakuje indeksów
ograniczyć liczbę zapytań do bazy stosując rożne formy cachowania
Go to the top of the page
+Quote Post
Gruchol
post 13.02.2015, 08:30:27
Post #3





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


A czy istnieje jakaś aplikacja która pozwoli mi sprawdzić które zapytanie wykonuje się najdłużej ?
Co do słabej maszyny, baza stała na maszynie 6gb ramu 4x3.0 ghz i tam było praktycznie to samo.
Teraz zrobiłem tak że mysql stoi na osobnej maszynie a na osobnej stoi php5, nginx itp.
Jest trochę lepiej jednak nadal strona strasznie wolno chodzi.
Go to the top of the page
+Quote Post
mmmmmmm
post 13.02.2015, 08:39:41
Post #4





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

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


Przejrzyj slow.log.
W pliku my.cnf masz zdefiniowane, gdzie leży:
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes
Go to the top of the page
+Quote Post
Gruchol
post 13.02.2015, 15:25:17
Post #5





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


A co muszę zrobić aby te błędy naprawić ?
[exclamation.gif] InnoDB is enabled but isn't being used
[exclamation.gif] Total fragmented tables: 2
Go to the top of the page
+Quote Post
Pyton_000
post 13.02.2015, 15:35:26
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Olać, to mówi że masz odpalone InnoDB ale nie używasz tego nigdzie i że 2 tabele mozna zoptymalizować (zdrefragmentować)
Go to the top of the page
+Quote Post
Gruchol
post 13.02.2015, 15:44:26
Post #7





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


Kupiłem lepszego VPSa pod bazę (3gb ramu, 2x2,5 GHZ) i cały czas muli tak samo.
A mysqltuner pokazuje : http://wklej.org/id/1634295/
Już nie wiem co mam zrobić :/
Go to the top of the page
+Quote Post
Pyton_000
post 13.02.2015, 15:46:26
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


a co zwraca slow.log o które prosił @mmmmmmm questionmark.gif
Go to the top of the page
+Quote Post
b4rt3kk
post 13.02.2015, 15:50:38
Post #9





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Cytat(Gruchol @ 13.02.2015, 15:44:26 ) *
Kupiłem lepszego VPSa pod bazę (3gb ramu, 2x2,5 GHZ) i cały czas muli tak samo.
A mysqltuner pokazuje : http://wklej.org/id/1634295/
Już nie wiem co mam zrobić :/


Muli, bo musi mulić - widocznie aplikacja, która korzysta z bazy jest mało optymalnie napisana. Przedstaw jakieś przykładowe zapytania z podstrony, która najbardziej muli.

Zabrałeś się do tego, za przeproszeniem, od d... strony, kupując od razu nowy vps. Najpierw optymalizujesz zapytania, triggery, indexy, funkcje jak to nie pomaga to lepszy sprzęt.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Gruchol
post 13.02.2015, 15:55:37
Post #10





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


slowlog pokazuje :
http://wklej.org/id/1634306/

Ten post edytował Gruchol 13.02.2015, 15:57:17
Go to the top of the page
+Quote Post
Pyton_000
post 13.02.2015, 16:03:01
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


To teraz zopytmalizuj te zapytanie a serwis zacznie latać.
Go to the top of the page
+Quote Post
Gruchol
post 13.02.2015, 16:20:56
Post #12





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


Niestety nie znam się aż tak bardzo aby optymalizować skrypty :/
W moim pliku to zapytanie wygląda tak :

  1. $qry = $db->prepare ( "SELECT name, honor, guild_id,
  2. (SELECT user_data.user_name FROM user_data WHERE user_data.user_id = leader_id) AS leader,
  3. (SELECT Count(user_data.guild_id) FROM user_data WHERE user_data.guild_id = guilds.guild_id) AS members
  4. FROM guilds
  5. ORDER BY honor DESC, members DESC LIMIT :pos, 15" );
  6. $qry->bindParam ( ':pos', $posFrom, PDO::PARAM_INT );
  7. $qry->execute ();


Był bym bardzo wdzięczny gdybyś pomógł mi to zoptymalizować.
Go to the top of the page
+Quote Post
Pyton_000
post 13.02.2015, 16:28:37
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Zerknij to:
  1. SELECT
  2. g.name, g.honor, g.guild_id, u.user_name AS leader, COUNT(ug.guild_id) AS members
  3. FROM
  4. guilds g
  5. JOIN user_data u ON(u.user_id = g.leader_id)
  6. JOIN uesr_data ug USING(guild_id)
  7. ORDER BY
  8. honor DESC, members DESC
  9. GROUP BY ug.guild_id
  10. LIMIT :pos,15


A jak to nie zadziała to sprawdź czy masz indeksy na polach:
user_data.guild_id
guilds.guild_id
user_data.user_id
Go to the top of the page
+Quote Post
Gruchol
post 13.02.2015, 16:35:24
Post #14





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


Nadal jest tak samo :/
(Tzn. aktualnie nie mam możliwość sprawdzenia czy kod działa jednak po wgraniu go muli cały czas tak samo :/ )

Ten post edytował Gruchol 13.02.2015, 16:51:24
Go to the top of the page
+Quote Post
sazian
post 13.02.2015, 18:28:02
Post #15





Grupa: Zarejestrowani
Postów: 1 043
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


  1. EXPLAIN
  2. SELECT name, honor, guild_id,
  3. (SELECT user_data.user_name FROM user_data WHERE user_data.user_id = leader_id) AS leader,
  4. (SELECT Count(user_data.guild_id) FROM user_data WHERE user_data.guild_id = guilds.guild_id) AS members
  5. FROM guilds
  6. ORDER BY honor DESC, members DESC LIMIT 0, 15;

pokaż wynik
Go to the top of the page
+Quote Post
b4rt3kk
post 13.02.2015, 18:36:50
Post #16





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Cytat(Pyton_000 @ 13.02.2015, 16:28:37 ) *
Zerknij to:
  1. SELECT
  2. g.name, g.honor, g.guild_id, u.user_name AS leader, COUNT(ug.guild_id) AS members
  3. FROM
  4. guilds g
  5. JOIN user_data u ON(u.user_id = g.leader_id)
  6. JOIN uesr_data ug USING(guild_id)
  7. ORDER BY
  8. honor DESC, members DESC
  9. GROUP BY ug.guild_id
  10. LIMIT :pos,15


A jak to nie zadziała to sprawdź czy masz indeksy na polach:
user_data.guild_id
guilds.guild_id
user_data.user_id


Wg mnie ten join, tylko po to, żeby zrobić counta jest tu niepotrzebny. Podzapytanie sobie lepiej poradzi.

  1. SELECT
  2. g.name, g.honor, g.guild_id, u.user_name AS leader, (SELECT COUNT(ug.guild_id) FROM user_data WHERE guild_id = guilds.guild_id) AS members
  3. FROM
  4. guilds g
  5. JOIN user_data u ON(u.user_id = g.leader_id)
  6. ORDER BY
  7. honor DESC, members DESC
  8. GROUP BY ug.guild_id
  9. LIMIT :pos,15


W ogóle to trochę bez sensu, żeby robić joina tylko po to, żeby zrobić counta. Już lepszym rozwiązaniem by było:

  1. SELECT
  2. g.name, g.honor, g.guild_id, u.user_name AS leader, ct AS members
  3. FROM
  4. guilds g
  5. JOIN user_data u ON(u.user_id = g.leader_id)
  6. JOIN (SELECT guild_id, COUNT(*) ct FROM user_data GROUP BY guild_id) gc ON gc.guild_id = g.guild_id
  7. ORDER BY
  8. honor DESC, members DESC
  9. GROUP BY ug.guild_id
  10. LIMIT :pos,15


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Pyton_000
post 13.02.2015, 19:11:31
Post #17





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Może i tak, nie robiłem testów wink.gif Nie chciało mi się, na szybko pisałem. Czasami wyniki mogą być różne więc każde rozwiązanie można przetestować.
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 Wersja Lo-Fi Aktualny czas: 29.03.2024 - 00:48