Archive for the 'mySQL' Category

26
Oct

Reminder: Ubuntu Server 7.04 aufsetzen

Kurzer Reminder für mich.

  • OS Installieren
  • Feste IP setzten:
    • /etc/network/interfaces
      iface eth0 inet static
      address 192.168.2.5
      netmask 255.255.255.0
      gateway 192.168.2.1
  • Module nachinstallieren
    • sudo apt-get install apache2 php5-common php5 libapache2-mod-php5 php5-mysql php5-pgsql mysql-server mysql-client openssh-server smbfs
    • Mod Rewrite aktivieren: a2enmod rewrite
  • Samba Laufwerk: mount -t smbfs //fileserver/foo /mnt/foo -o username=USER,password=PASS,umask=0002,uid=www-data
    Am besten über ein Startskript und dann per update-rc.d NAME_DES_STARTSKRIPTS_IN_INIT.D defaults 90 aktivieren.
  • DocRoot des Apache auf /mnt/foo zeigen lassen (/etc/apache2/site-enabled/000-default)
  • dyn. mass hosting einrichten
  • Apache neu starten: apache2ctl restart
  • mySQL DB Kennwort vergeben
  • Sicherung der Datenbank einrichten
03
Aug

PHP - Schnell oder wartbar?

Den richtigen Weg zwischen “Schnell” und “Wartbar” zu finden ist nicht einfach. Wie wichtig Code-Optimierung ist, sieht man an vielen Beispielen. Während „High End“-Root Server oft schon mit einem einzelnem Forum ausgelastet sind, pflegen wir wesentlich schwächere/ältere Systeme, die eine deutlich höhere Anzahl Anfragen verarbeiten.

Hierzu wieder zwei interessante Links:

Gerade die Datenbank ist ein beliebter Engpass. Deshalb sollte man, wann immer möglich, af den unnötigen Overhead verzichten.

  • Viele Anforderungen lassen sich mit einfachen Dateien lösen. Der direkte Zugriff ist schneller, als die Abfrage einer Datenbank. (Die muss schliesslich auch Dateien öffnen …)
  • Eine RAM Disk beschleunigt den Zugriff auf Dateien enorm.
  • Auch Datenbanken lassen sich komplett in den RAM legen. In mySQL nennt sich das MEMORY Storage Engine.
  • mySQL Tabellen lassen sich Partitionieren. Das beschleunigt den Zugriff auf die Daten mitunter enorm. (Date Tutorial, Range Tutorial)

Gerade die Leistung eines Datenbankservers lässt erheblich nach, sobald die abzufragende Tabelle nicht mehr in den Arbeitsspeicher passt. Da zeigt sich dann auch sehr schnell der Unterschied zwischen einem Join und einem WHERE foo.id=bar.id.

28
Jul

Trigger in mySQL

Folgendes (mySQL 5) Skript legt eine Tabelle an. Alle Daten die im Feld passwd gespeichert werden, wandelt mySQL in einen md5 String um. Ein bereits gewandelter String wird nicht neu gewandelt.

CREATE TABLE `foo` (
   `id` int(11) NOT NULL,
   `passwd` varchar(255) collate latin1_general_ci NOT NULL,
   `name` varchar(255) collate latin1_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

DELIMITER $$

CREATE TRIGGER md5ize_on_insert
BEFORE INSERT ON foo
FOR EACH ROW
      BEGIN
         SET NEW.passwd = md5( NEW.passwd ) ;
      END$$

CREATE TRIGGER md5ize_on_update
   BEFORE UPDATE ON foo FOR EACH ROW
      BEGIN
         IF NEW.passwd NOT REGEXP '^[0-9A-Za-z]{32}$' THEN
            SET NEW.passwd = md5(NEW.passwd);
         END IF;
      END $$

DELIMITER ;

Selbsterklärend und erhebt keinen Anspruch auf Vollständigkeit.

28
Jun

SELECT FOUND_ROWS();

Als mir jemand von SQL_CALC_FOUND_ROWS erzählte - ich glaube es war Darren -, dachte ich, ein SELECT COUNT(*) wäre kein Unterschied. Heute habe ich einen Verwendungszweck gefunden.

Ich arbeite zur Zeit an einer möglichst generischen Grundlage - ich möchte es nicht Framework nennen - für weitere Entwicklungen. In den ORM Objekten, die den Zugriff auf Tabellen ermöglichen, erzeuge ich dynamisch einen Join, um verschachtelte Objekte mit möglichst wenig “Kosten” zu erzeugen. Für die Spaltenbezeichnung benötige ich Aliase.

Die Funktion, die eine ganze Liste dieser Objekte erzeugt, kann natürlich gefiltert werden. Sobald ich nach einem Alias filtere, kann ich WHERE nicht verwenden und muss das kostenintensivere HAVING verwenden.

Mit SQL_CALC_FOUND_ROWS veranlasse ich mySQL dazu, die Gesamtanzahl der Treffer - ohne LIMIT - zu ermitteln. Die Anzahl der Treffer kann im Anschluss mit SELECT FOUND_ROWS(); ausgelesen werden.

mysql> SELECT SQL_CALC_FOUND_ROWS col1, col2, col3 AS foo FROM table HAVING foo = 'bar';
+------+------+-----+
| col1 | col2 | foo |
+------+------+-----+
| ...  | ...  | ... |

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|        28123 |
+--------------+
1 row in set (0.00 sec)

Wesentlich einfacher, als dynamisch Queries mit Aliasen und Joins umzuschreiben.

Danke für den Tipp :)

26
Jun

Froscon 2006 Review

Die Froscon war wirklich einen Besuch wert. Vielen Dank an die Organisatoren.

Die Konferenz war wirklich gut organisiert. Überall auf dem Gelände hatte man einen sehr schnellen W-Lan Zugang (Eclipse mit 130Mb in 3 Minuten), die Uni ist wirklich vorbildlich und sogar das Spiel am Samstag wurde im großen Hörsaal übertragen.

Ich war konsequent in sovielen Vorträgen wie möglich. Hier ein kurzer Auszug der Vorträge, die mir besonders in Erinnerung bleiben:

  • Webservices Toolkit für PHP5
    Ein sehr interessantes Projekt, das mit Hilfe der PHP 5 Reflection API z.B. einen WSDL Generator ermöglicht. Infos finden sich bei der PHPUGDO.
  • MySQL Cluster (Geert Vanderkelen)
    Sehr insteressanter Vortrag über die neuen Möglichkeiten eines mySQL Clusters.
  • Pivot Tables in mySQL 5 (Guiseppe Maxia)
    Der Vortrag war unterhaltsam und sehr gut nachvollziehbar. Guiseppe Maxia zeigt eine Möglichkeit, wie man mit mySQL Procedures und Functions automatisiert den SQL Query für eine Pivot Tabelle erzeugt. Wie oft hätte ich dieses Skript schon gebrauchen können! Danke :)
  • PHP best practice (Tobias Schlitt und Kore Nordmann)
    Alle Infos aus diesem Vortrag habe ich schon mindestens 100 mal gehört/gelesen. Für mich war leider nichts Neues dabei. Die Reaktionen und Fragen aus dem Publikum zeigen aber, wie wichtig solche Vorträge sind. :)

Leider habe ich es nicht geschafft, mir die PostgreSQL Vorträge anzusehen.  Aber vielleicht kann ich die PostgreSQL Usergroup zu einem Vortrag in unserer PHPUGFFM einladen?

14
Mar

MySQL 4.0 Referenzhandbuch :: 7.1.4 Benutzer-Variablen

Vergesse ich immer wieder, obwohl es so nützlich ist:

SELECT @myID:=user_id FROM user WHERE user_name='Max Mustermann';
SELECT *
FROM user_properties
WHERE user_id = @myID;

MySQL 4.0 Referenzhandbuch :: 7.1.4 Benutzer-Variablen

08
Mar

IP in eine Ganzzahl wandeln

Die mySQL Funktion INET_ATON() wandelt eine IP in eine Ganzzahl.

SELECT INET_ATON("209.207.224.40");
-> 3520061480

209*255^3 + 207*255^2 + 224*255 + 40

08
Mar

Backup mit myqldump und gzip

mysqldump NAME_DER_DATENBANK | gzip > backup.sql.gz
08
Mar

Left Joins in mySQL

SELECT
user.id,
user.name,
ort.ort,
hoddy.hobby
FROM
user LEFT JOIN ort ON user.ort = ort.id
LEFT JOIN hoddy ON user.hobby = hobby.id