Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql] kilka pytań, optymalizacja kilku kodów
krystian_p
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 29.06.2007

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


Jestem początkującym programistą. Mam zamiar stworzyć serwis, w którym będą tyciące materiałów dotyczących miast Polski. Na jedno miasto przypadnie średnio 5-10 artykułów... Taki ogrom informacji może niekorzystnie wpłynąć na pracę serwera.
Mam wiele materiałów dotyczących optymalizacji kodu PHP, jednak nie do końca znam się na stworzeniu kodu, dzięki któremu praca bazy danych będzie sprawniejsza. Przygotowałem zatem kilka przykładów i proszę Was, byście poradzili mi w jaki sposób mam przerobić dany kod, by serwis działał szybciej.


1. Chcę sprawdzić, czy istnieje rekord o 'id' równym liczbie 4:
Kod
$a = mysql_fetch_array(mysql_query("SELECT * FROM tabela WHERE id='4'"));
if($a['id'] == ''){ echo'brak'; } else{ ...


2. Chcę wyciągnąć kilka pól z danego rekordu:
Kod
$a = mysql_fetch_array(mysql_query("SELECT pole, pole2 FROM tabela WHERE id='$id'"));
echo $a['pole'];
echo $a['pole2'];


3. Chcę wyciągnąć tylko jedno pole z danego rekordu:
Kod
$a = mysql_fetch_array(mysql_query("SELECT pole FROM tabela WHERE id='$id'"));
echo $a['pole'];


4. Chcę policzyć, ile jest rekordów, w których 'pole' jest równe liczbie 4:
Kod
$a = mysql_result(mysql_query("SELECT COUNT(*) FROM tabela WHERE pole='4'"),'0');


5. Chcę stworzyć listę rekordów, w których 'pole' jest równe liczbie 4:
Kod
$a = mysql_query("SELECT * FROM tabela WHERE pole='4'");
while($r = mysql_fetch_array($a)){...



Tu się zaczyna problem. Czytałem o niejakich indexach. Jak się tworzy indexy w programie PHPMyAdmin dla danego pola? Jakie trzeba wysłać zapytania, żeby utworzyć te indexy? Jakich zapytań trzeba użyć, by skorzystać z indexów?

Ma to jakiś związek z tym, co jest poniżej (jest takie coś w PHPMyAdmin)?
Nazwa klucza Typ Moc Działanie Pole
PRIMARY PRIMARY 1 Edycja Usunięcie id


To jest dla mnie bardzo ważny kod, bo jeśli będzie np. 10.000 rekordów i będę chciał w szybki sposó wyciągnąć tylko 2 w liście to może wystąpić problem...


6. Chcę wyciągnąć id rekordu, w którym jest największy id:
Kod
$a = mysql_fetch_array(mysql_query("SELECT pole FROM tabela ORDER BY id DESC LIMIT 0,1"));


7. Chcę edytować wartość danego pola (np. 'pole2') w rekordach, w których 'pole' jest równe liczbie 4:
Kod
mysql_query("UPDATE tabela SET pole2='tekst' WHERE pole='4'");


tu chyba też kłamiają się indexy... Ta sama zasada będzie występować podczas usuwania rekordów z wyznaczonymi wartościami?

8. czy warto używać opcji NULL?
strona działa szybciej, jeśli w zapytaniu użyje się kodu:
pole IS NULL

czy, jeśli użyje się:
pole=''

no i przy okazji chciałbym wiedzieć, czy w kodzie PHP szybciej działa kod:
Kod
if($a <> '')...
czy
if($a != '')...



9. Dodatkowo chciałbym wiedzieć, czy warto przed includowaniem pliku sprawdzać, czy on w ogóle istnieje, czy lepiej, bo szybciej, użyć od razu takiego kodu:
@include('plik.php')


--
Nie prawda że jest czytelniej?

~kwiateusz
Go to the top of the page
+Quote Post
flv
post
Post #2





Grupa: Zarejestrowani
Postów: 130
Pomógł: 1
Dołączył: 29.06.2007

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


zacznijmy od tego że null i '' to inne wartości, co do indeksów, nie stosuj ich tam gdzie wykonujesz często operacje modyfikujące(INSERT,UPDATE,REPLACE,DELETE etc.) bo dopisanie do indeksu to też dodatkowe obciążenie, z tych przykładów co podałeś to prędzej sobie zaszkodzisz, na pola id zwykle nie trzeba nakładać indeksu bo są to zazawyczaj klucze główne(no chyba ze to relacje do innej tabeli) i są już one otworzone. Polecam dokladne przejrzenie manuala mysql
http://dev.mysql.com/doc/refman/4.1/en/create-index.html
http://dev.mysql.com/doc/refman/4.1/en/mysql-indexes.html
Tutaj znajdziesz informacje na jakie kolumny zakladac indeksy, a takze jak to robic.
Między używaniem <> i != w php nie ma żadnej różnicy w szybkości, zresztą w mysql też tyle że != nie jest w standardzie ANSI SQL. Poszukaj w manualu czy w jakiejś książce dodatklowych informacji nt. optymalizacji baz danych bo w jednym temacie raczej ciężko dowiedzieć sie coś nt. tak obszernego zagadnienia. A co do file_exists to sprawdzanie wydaje sie niepotrzebne chociaż i tak na takich zmianach zbyt wiele nie zyskasz ; )

Ten post edytował flv 3.07.2007, 16:14:37
Go to the top of the page
+Quote Post
krystian_p
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 29.06.2007

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


czyli sugerujesz, że moje kody są dobre?
że na pewno nie spowalniają systemu?
kiedyś ktoś mi mówił, że takimi kodami jedynie obciążam serwer...

niebardzo znam angielski, znasz może jakieś pomoce, ale polskie?
Go to the top of the page
+Quote Post
flv
post
Post #4





Grupa: Zarejestrowani
Postów: 130
Pomógł: 1
Dołączył: 29.06.2007

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


A gdzie ja tak napisałem? smile.gif Twierdze raczej odwrotnie. Oprócz tego co napisałem to można jeszcze przyczepić się do tego:
Kod
$a = mysql_fetch_array(mysql_query("SELECT pole, pole2 FROM tabela WHERE id='$id'"));

i teraz jeśli mysql_fetch_array wsadzisz w pętle to przy każdym przejściu pętli będzie wykonywane zapytanie, przykładowo jeśli będziesz 'wyjmował' 100 rekordów to też 100 razy zostanie wykonane zapytanie.
Kod
$sql = mysql_query("SELECT pole, pole2 FROM tabela WHERE id='$id'");
$a = mysql_fetch_array($sql);

Pozmieniaj to na taką strukture. Tak wogóle to chyba najwyższa pora nauczyć sie angielskiego ; )
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 Aktualny czas: 21.08.2025 - 11:32