PHP & mySQL Optimierung Tipps und Tricks

#0
22.05.2005, 15:21
Timothy
zu Gast
#1 Hi

ich habe ein Internetprojekt mit sehr aufwendigen Datenbankabfragen und leider grossen PHP Scripten.

Welche Tipps habt ihr um das ganze oder PHP / MYSQL allgemein zu optimieren?
Wie optimiert man PHP Scripte? Wie Datenbankabfragen?
Seitenanfang Seitenende
22.05.2005, 15:32
Member
Avatar Laserpointa

Beiträge: 2175
#2 mal ein paar Snippets:

Zitat

MySQL:

Indexe setzen fuer sehr haeufig abzufragende Spalten

wenn Result uninteressant (z.B. nur UPDATE):
mysql_unbuffered_query statt mysql_query

"Vorfilterung" im mySQL Query statt IF-Abfragen in PHP Beispiel:
IF (x > 0 && curtime() >= refetch, x, 0) AS x

"Vorberechnung" von Zeitdifferenzen statt in PHP:
SELECT TO_DAYS(NOW()) - TO_DAYS(tstamp) AS diffdays


PHP:

Funktionen die nicht mehr verwendet werden rauswerfen -> "interpretation time" niedriger

Unnoetiges Rumschaufeln/Kopieren von Variablen vermeiden (WENNs auf Performance ankommt)

Funktionsparameter per Referenz uebergeben (WENNs auf Performance ankommt)

Quelle Google / Abakus Forum
Benchmark Tests bzw. wie man richtig Schleifen bastelt:
http://www.blueshoes.org/en/developer/php_bench/

auch interessant:
PHP Code auf Geschwindigkeit optimieren

Programme zum cachen von PHP Scripten:
- Zend Performance Suite (http://www.zend.com/)
- PHP Accelerator (http://www.php-accelerator.co.uk/)
- Alternative PHP Cache (http://pecl.php.net/package/APC)
- AfterBurner Cache (http://bwcache.bware.it/)
- TurckMMCache (http://sourceforge.net/project/turckmm-cache/)

A HOWTO on Optimizing PHP: http://phplens.com/lens/php-book/optimizing-debugging-php.php
Large Scale PHP: http://talks.php.net/show/lt2004-lamp/

ansonsten halt Apache richtig konfigurieren und nicht benötigte Apache-Module und Extensions entfernen...

auch interessant, kurz, knapp und prägnant:
http://reinholdweber.com/?p=3
Seitenanfang Seitenende
22.05.2005, 15:33
Timothy
zu Gast

Themenstarter
#3 mercy für deine Hilfe in meinen Themen
werde mich da mal durchkämpfn ;)
Seitenanfang Seitenende
25.08.2005, 18:47
Member

Beiträge: 11
#4 Hallo,

mal aus dem Stehgreif was mir dazu einfällt (und nicht schon genannt worden ist)...

PHP:

1) Du schreibst etwas von grossen PHP-Scripten: Evtl. kann man ja die Funktionalität sinnvoll auf mehrere kleinere Scripte verteilen und diese dann entweder als eigene php-Datei aufrufen.

z.B. angenommen du hast deine komplette Seite mit Forum, Warenkorb, Suchfunktion etc. alles in einer index.php - dann wäre es besser daraus eine index.php, forum.php, warenkorb.php und suchen.php zu machen (und die entsprechend zu verlinken)

Oder du lädst ggf. selten benötigte Programmteile nur bei Bedarf (via include).

2) Evtl. mußt du auch nicht alles zur Laufzeit dynamisch erzeugen lassen sondern kannst es statisch (z.B. als html) ablegen.

3) Anscheinend ist es besser/schneller, Ausgaben/Strings nur dann in '"' (= doppelte Anführungszeichen) zu setzen, wenn diese auch wirklich Variablen enthalten. Also statt

echo "Willkommen auf meiner Seite";
besser
echo 'Willkommen auf meiner Seite';

Ob echo 'Heute ist der'.$datum; schneller als echo "heute ist der $datum" ist, müßtest du mal mit o.g. Benchmark-Programmen testen.

4) Grundsätzlich könntest du natütlich nochmal deine Programm-Logik durchgehen (Abafragen, Schleifen, etc.) ob sich da noch was optimieren läßt (z.B. nicht x-mal die gleiche Sache prüfen, wenn das Ergebnis eh schon ermittelt wurde)


mySQL:

1) Datentypen/Spalten so wählen, daß Sie möglichst optimal sind. Also nicht varchar wenn du immer nur zwei Zeichen speichern willst, lieber tinyint (unsigned) statt int, wenn du nur werte z.B. von 0-100 speichern willst etc.

2) Indexe werden bei bestimmten Abfrage-Konstellationen (z.B. where col1 AND col2) nicht verwendet bzw. die Reihenfolge ist wichtig (mal unter http://dev.mysql.com/doc/mysql/en/mysql-optimization.html stand da was)

3) Nur die Spalten/Felder abfragen, die du auch auswerten willst/benötigst - und diese auch EXPLIZIT angeben,

also nicht
SELECT * FROM kunden WHERE ...

sondern
SELECT id, name, plz, ort FROM kunden WHERE ...

(siehe auch (2) )


4) Statt dir Daten mit getrennten Abfragen aus mehreren Tabellen zusammen zu suchen (Select name from kunden_namen..., Select Ort vom kunden_orte, ...) ist es schneller, die zusätzlichen Tabellen/Spalten via JOIN in den query einzubinden.

5) Datenbank-Theorie/Normalisierung:
Grau ist alle Theorie... ;-)
Eigentlich sollte man ja alles schön normalisieren etc. (also quasi keine Dinge mehrfach/doppelt speichern). ABER: Wenn es wie im Web i.d.Regel auf die Geschwindigkeit ankommt kann es (ist es) durch aus akzeptabel sein, lieber mehr Dinge in einer Tabelle zu speichern, also z.B. statt:

id | name | plz_id | ort_id
(wobei plz_id, ort_id jeweils auf eine extra Tabelle mit id | plz bzw id | ortname verweisen)

lieber gleich

kunden_id | name | plz | ort

speichern, weil du das dann mit einem einfachen SELECT alles auslesen kannst.


So... habe bestimmt was vergessen ... aber fürs Erste sollte das reiche ;-)

Viel Erfolg!
__________
NeueMedien.Net - Internet Netzwerke Sicherheit
Seitenanfang Seitenende