Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Optymalizacja MySQL (SELECT)
Forum PHP.pl > Forum > Przedszkole
servs
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.
konrados
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.
servs
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?
konrados
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.
servs
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.
croc
Do czego ma służyć system?
servs
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.
croc
No tak, tylko dlaczego dla wyszukiwarki robisz WHERE title = 'era'? Powinno być MATCH ... AGAINST albo LIKE.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.