Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Optymalizacja MySQL (SELECT)
servs
post
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

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


Witam,

Od jakiegoś czasu zacząłem się interesować optymalizacją pracy MySQL i uparłem się, żeby uniknąć "rżnięcia" bazy przez takie polecenie

  1. $sql = mysql_query("SELECT `name` FROM tabela WHERE title = 'era'");
  2.  
  3. while($m = mysql_fetch_array($sql)){
  4. echo $m['name'];
  5. }

Co prawda jak mamy tabelę o sile 10 000, to jeszcze jest ok. Ale jak ilość rekordów przekracza 1 000 000, to już robi się problem.
Jest jakiś sposób optymalizacji takich instrukcji dla odciążenia MySQL?

Pozdrawiam.

Ten post edytował servs 23.10.2011, 17:20:29
Go to the top of the page
+Quote Post
konrados
post
Post #2





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

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


No po pierwsze primo, działasz tu na varchar (title) - jest parokrotnie wolniejsze niż działanie na int(id).

Po drugie primo, robisz select * - czyli wszystkie pola - robiąc select nazwa_pola_1, nazwa_pola_2 uzyskasz nieco na prędkości.

Ale najważniejszy jest punkt #1.
Go to the top of the page
+Quote Post
servs
post
Post #3





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

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


Tak, ale zakładam, że trzeba poszukać odpowiednią treść np. przy wyszukiwarce.
Apropo SELECT *, napisałem to z lenistwa. Dobra. Załóżmy, że jest SELECT `name`

Ale chodzi tu o rezanie bazy przez polecenie while.

Czytałem jeszcze coś o takiej możliwości:
  1. SELECT * FROM 'tabela' WHERE 'id' IN (1,3,5,9,11);

Ale, czy IN nie dotyczy TYLKO kolumn INT?

Ten post edytował servs 23.10.2011, 17:23:13
Go to the top of the page
+Quote Post
konrados
post
Post #4





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

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


No inaczej się nie da.

Możesz jeszcze dodać do zapytania limit - by nie było tak, że user wpisze sobie 'e' i znajdzie miliony rekordów.

Update: jest jeszcze takie coś jak sql caching - poszukaj w google, ja się tym nigdy nie interesowałem.

Update2:
Cytat
Ale, czy IN nie dotyczy TYLKO kolumn INT?


W tym przypadku tak. Normalnie jednak możesz używać jakiegokolwiek typu.

Ten post edytował konrados 23.10.2011, 17:26:37
Go to the top of the page
+Quote Post
servs
post
Post #5





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

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


Owszem, jest Qcache, ale przy większych obciążeniach nie zdaje egzaminu.
Do cachowania wyników zdecydowanie lepiej zastosować memcache. Działa zdecydowanie szybciej i nie obciąża tak RAMu.
Go to the top of the page
+Quote Post
croc
post
Post #6





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


Do czego ma służyć system?
Go to the top of the page
+Quote Post
servs
post
Post #7





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 18.11.2006
Skąd: gorzów

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


Kolego @crock, nie poruszam tu problemu nad jakąś poważną aplikacją, a chodzi mi o uzupełnienie wiedzy w tym temacie.
Założenie może być takie, że będzie to wyszukiwarka w typie mini google. Realizacja wszystkich procesów na jednym serwerze. Ponadto piszę tu o samym wyświetlaniu wyników, bez indeksowania Internetu.
Go to the top of the page
+Quote Post
croc
post
Post #8





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


No tak, tylko dlaczego dla wyszukiwarki robisz WHERE title = 'era'? Powinno być MATCH ... AGAINST albo LIKE.
Go to the top of the page
+Quote Post

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: 24.08.2025 - 21:12