Geschwindigkeit von PHP mit MySQL Sockets optimieren

In Ubuntu 16.04 ist die Version MySQL 5.7 und PHP7 enthalten. Vielen Anwendungen verwenden für die Kommunikation von PHP zu MySQL das Netzwerk über die Adresse 127.0.0.1 (localhost). Läuft der MySQL Server auf dem gleichen System wie die PHP Anwendung, dann gibt es auch die Möglichkeit der Kommunktion über eine Unix Socket Verbindung.

Die MySQL Socket befindet sich unter /var/run/mysqld/mysqld.sock. Prüfen kann es mit diesem Kommando.

netstat -nl |grep mysql

MySQL 5.7 ermöglicht die Authentifizierung per Netzwerk oder Socket (Plugin).

Um einen Benutzer (user) mit einem Kennword (password) den Zugriff per Netzwerk (localhost) zu erlauben, ist das Kommando notwendig.

CREATE USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Der Zugriff per MySQL Socket ist ohne Kennwort möglich. Der Apache Server läuft in Ubuntu unter dem Benutzer ‚www-data‘.

CREATE USER 'www-data'@'localhost' IDENTIFIED WITH auth_socket;

Jetzt müssen wir dem Benutzer noch die notwendigen Rechte geben. Hier ein Beispiel für alle Rechte (ALL) auf allen Datenbanken (%) und Tabellen (*) zu gewähren.

GRANT SELECT ON `mysql`.* TO 'www-data'@'localhost';
GRANT ALL PRIVILEGES ON `%`.* TO 'www-data'@'localhost';

Eine höhere Sicherheit gibt es, wenn der Benutzer (www-data) nur Zugriff auf die Datenbank (database) mit bestimmten Kommandos (SELECT, INSERT, usw.) erhält.

GRANT SELECT, INSERT, UPDATE, DELETE PRIVILEGES ON 'database'.* TO 'www-data'@'localhost';

Jetzt müssen die Benutzerrechte neu gelesen werden.

FLUSH PRIVILEGES;

Zum entfernen der Rechte kann man diese Kommando verwenden.

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'www-data'@'localhost';

Um die Einstellungen zu Prüfen kann man diese Befehle verwenden.

SHOW GRANTS FOR 'www-data'@'localhost';
SELECT Host,USER,Plugin,Authentication_string FROM `mysql`.`user`;

Die Socket Verbindung kann man mit dem MySQL Client prüfen.

sudo -u www-data mysql -u www-data

MySQL Kompression pro Tabelle aktivieren

Seit MySQL 5.5 besteht in der InnoDB Datenbank die Möglichkeit eine Tabelle zu komprimieren.

Zu erst müssen wir einige Einstellung ändern, damit wir die Komression nutzen können.

sudo vim /etc/mysql/conf.d/mm_mysql.cnf

[mysqld]
innodb_file_per_table = 1
innodb_file_format = Barracuda
open-files-limit = 2048
table_cache = 512

Nach einem Neustart von MySQL sind die Einstellungen aktiv.

sudo service mysql restart

Jetzt kann man pro Tabelle die Kompression einstellen. Das bringt bei Tabellen mit Blob Felder eine Ersparnis von 50% Speicherplatz.

ALTER TABLE 'tabellen_name' ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;

Mit dem Befehl kann man prüfen, welche Einstellung pro Tabelle vorgenommen wurde.

SELECT TABLE_NAME, ENGINE, VERSION, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, CREATE_OPTIONS
FROM information_schema.tables
WHERE TABLE_SCHEMA='schema_name';

Das Ergebnis der Dateiänderung kann man hiermit prüfen.

mysql> \! ls -l /var/lib/mysql/schema_name/*.ibd