![]() |
![]() ![]() |
![]() |
![]()
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:
Przykładowe zapytanie do bazy, które powoduje obciążenie to:
Czy ktoś mógłby mnie naprowadzić jak można to zoptymalizować? Proszę o pomoc. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Cytat ENGINE=MyISAM Jak duży ruch masz na tej tabeli? IMHO wystarczy ją dać na InnoDb - z tym że z fulltexta musiałbyś zrezygnować... |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 459 Pomógł: 26 Dołączył: 1.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Sephirus: W tym konkretnym przypadku MyISAM może być nawet szybszy od InnoDB przy odczycie danych. Dodatkowo, jak sam zauważyłeś InnoDB w wersji MySQL 5.5 nie obsługuje indeksu pełnotekstowego (dopiero wersja 5.6 to wprowadza).
@djgarsi: 1. Jesteś pewien, że to ta tabela i to zapytanie jest wąskim gardłem? W tym przypadku mamy do czynienia z "idealną sytuacją", bo na dobrą sprawę wszystkie dane mogą być odczytane bezpośrednio z indeksu, z pominięciem tabeli samej w sobie. 2. Pamiętaj, że ilość rekordów wcale nie ma aż tak dużego znaczenia w tabeli. Najlepiej jakbyś pokazał nam slow query loga. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
MyISAM jest kiepski jak jest dużo odczytów/selectów bo blokuje całą tabelę - nie wiem ale podejrzewam że to może być to akurat.
EDIT: @Crozin - musisz mi dać więcej info czemu w tym przypadku MyISAM miałby być szybszy? (IMG:style_emoticons/default/tongue.gif) Ogólnie jak w MyISAMIE na autoincremencie są dziury i jest dużo odczytów to MyISAM nie wyrabia, z tego co sam praktykuje to raczej nigdy nie używam go dla tabel, które muszą mieć szybki odczyt wiec stąd nie kumam do końca :| Ten post edytował Sephirus 6.02.2013, 17:24:07 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 459 Pomógł: 26 Dołączył: 1.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
@Crozin - niestety nie mam dostępu (chyba) do pliku z logami. To serwer współdzielony.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
hmm bez tego będzie ciężko, musiałbyś obserwować procesy w MySQL (o ile też masz do tego dostęp - SHOW PROCESSLIST) i jak masz fart to zobaczysz jakieś długo wykonujące się zapytanie lub dużo zapytań naraz.
Może masz niewydajną aplikacje - z dużą liczbą zapytań. Z czego korzystasz do MySQL? mysql_*** czy PDO? Może udałoby Ci się policzyć ile na żądanie masz zapytań itp. Bo tak jak zauważył Crozin to wcale nie musi być to konkretne zapytanie. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 459 Pomógł: 26 Dołączył: 1.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
hmm bez tego będzie ciężko, musiałbyś obserwować procesy w MySQL (o ile też masz do tego dostęp - SHOW PROCESSLIST) i jak masz fart to zobaczysz jakieś długo wykonujące się zapytanie lub dużo zapytań naraz. Może masz niewydajną aplikacje - z dużą liczbą zapytań. Z czego korzystasz do MySQL? mysql_*** czy PDO? Może udałoby Ci się policzyć ile na żądanie masz zapytań itp. Bo tak jak zauważył Crozin to wcale nie musi być to konkretne zapytanie. Obecnie uzywam mysql_***, jednak po tej akcji na bank przepiszę serwis na PDO. |
|
|
![]()
Post
#9
|
|
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ę:
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
Ten post edytował Sephirus 6.02.2013, 17:47:39 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 459 Pomógł: 26 Dołączył: 1.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Niestety nie mam takich danych "slow_log". A jak widać przydałyby się bardzo.
No cóż, na początej przepiszę system na PDO, a później będę kombinował z tą funkcją my_mysql_query (bardzo ciekawy pomysł, prosty a zarazem trudny do wpadnięcia na niego) (IMG:style_emoticons/default/smile.gif) Dziękuję za pomoc. Pozdrawiam. (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Kombinuj (IMG:style_emoticons/default/smile.gif) Ale.. nie tylko mi się pomógł należy bądźmy uczciwi ;P
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Najpierw sprawdź sobie my_mysql_query. Myślę, że przejście na PDO nic nie da.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 3 Dołączył: 20.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem dokładnie jak zachowują się indeksy w MySQLu, ale może zrób indeks w kolejności KEY `www` (`identyfikator`, `www`) jeśli poprawiłoby to selektywność wybierania rekordów.
Ile rekordów zazwykle zwraca to zapytaniu ? Po zapytaniu wydaje mi się że jeden, ale wolę się upewnić, bo może jest za duzy ruch sieciowy niepotrzebnie generowany. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
z tego co słyszałem to mysqli jest szybsze od pod
a na pewno będzie łatwiej przerobić z mysql_* po przejściu na obiektowe mysqli można bardzo łatwo wykonać test "my_mysql_query", wystarczy zrobić klasę dziedziczącą po mysqli i przeciążyć query |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.08.2025 - 20:09 |