Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Optymalizacja połączenia z bazą
djgarsi
post
Post #1





Grupa: Zarejestrowani
Postów: 459
Pomógł: 26
Dołączył: 1.06.2009

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


Witam.

Od jakiegoś czasu mam problem z przeciążeniem serwera, spowodowanym nieoptymalnym połączeniem z bazą (tak twierdzi hostingodawca).
Struktura tabeli z największą ilością danych (200tys rekordów) to:
  1. CREATE TABLE IF NOT EXISTS `pliki` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nazwa` text NOT NULL,
  4. `www` int(2) NOT NULL,
  5. `identyfikator` int(11) NOT NULL,
  6. `data_dodania` datetime NOT NULL,
  7. `wyswietlen` int(11) NOT NULL DEFAULT '0',
  8. `pobran` int(11) NOT NULL DEFAULT '0',
  9. `ocena` int(11) NOT NULL DEFAULT '0',
  10. `polecane` tinyint(1) NOT NULL DEFAULT '0',
  11. `blokada` tinyint(1) NOT NULL DEFAULT '0',
  12. PRIMARY KEY (`id`),
  13. KEY `www` (`www`,`identyfikator`),
  14. FULLTEXT KEY `nazwa` (`nazwa`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=211448 ;

Przykładowe zapytanie do bazy, które powoduje obciążenie to:
  1. $zap = 'SELECT www,identyfikator FROM pliki WHERE www="'.$www.'" and identyfikator="'.$identyfikator.'"';
  2. $query = mysql_query($zap) or die('Blad zapytania');


Czy ktoś mógłby mnie naprowadzić jak można to zoptymalizować?
Proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





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

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


No pasowałoby się przenieść na PDO (IMG:style_emoticons/default/smile.gif) Aczkolwiek to problemu nie rozwiąże.

W bazie masz dostęp jedynie do swojej bazy - możesz masz też dostęp do bazy "mysql" tam masz tabelę "slow_log", która ma info o tych "slow queries".

Proponuje Ci na szybko, wziąć całą apkę, zrobić backup kodu, napisać w jakimś wszędzie dołączanym pliku funkcję:

  1. function my_mysql_query($query) {
  2. $t = microtime(true);
  3. $result = mysql_query($query);
  4. error_log('tu info o zapytaniu i trwaniu: '.(microtime(true) - $t));
  5. return $result;
  6. }


Albo coś w tym stylu i nadpisałbym we wszystkich skryptach mysql_query => my_mysql_query. Jak dobrze przygotujesz tą funkcję, dostaniesz info jakie zapytanie ile Ci zabiera czasu i ile jest zapytań na request.

EDIT: (IMG:style_emoticons/default/smile.gif) Przede wszystkim wrzuć to zapytanie samo do bazy i zobacz w ile się wykona (nadaj jakieś tam te pola które wrzucasz z PHP) - możesz też dodać zaraz po SELECT klauzulę SQL_NO_CACHE aby mieć pewność ,że czas jest poprawny

  1. SELECT SQL_NO_CACHE ....


Ten post edytował Sephirus 6.02.2013, 17:47:39
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 23:31