Frage zu MySQL 4.1 + charset (Verstehe es nicht mehr ganz!)

MySQL, PostgreSQL, SQLite
schröder
Posts: 56
Joined: 2003-05-04 12:52

Frage zu MySQL 4.1 + charset (Verstehe es nicht mehr ganz!)

Post by schröder » 2006-01-31 16:36

Das CMS läuft mit ISO-8859-1 und Länderkennzeichen de.
Die MySQL habe ich aus der Box ohne Veränderungen übernommen und benutze auch keine *.cnf Datei.

War bisher alles OK und ist es auch noch, trotzdem habe ich Verständnisprobleme.

Ich habe jetzt ein mysqldump auf Befehlszeilenebene auf der Unix Maschine gemacht. Soweit ich es kapiert habe macht mysqldump das backup in UTF-8.

Jetzt habe ich diesen dump in eine MySQL auf einem Windows 2000 Rechner übertragen. Dazu benutze ich den MySQL System Tray Monitor mit dem MySQL Administrator. Die Windows MySQL benutze ich ebenfalls ohne *.cnf Datei.

Der Import erfolgte als UTF-8. Man kann das auswählen.

Hat auch funktioniert, obwohl der restore für eine 1.5 MB Datei mit knapp 30 Minuten auf einem Athlon 1200 sehr lange gedauert hat.

Frage 1: Meine Daten kommen alle ordentlich raus, das heißt ich kann diese Konfiguration (aber eigentlich ist ja nichts konfiguriert) so weiter benutzen?

Frage 2: Mit phpMyAdmin habe ich die Systeminfos auf der Unix Maschine mir anzeigen lassen, hier ein Screenshot http://home.arcor.de/nhz6/mysql1.jpg . Wie kann ich die Einstellungen optimieren, wenn das überhaupt möglich ist?

Danke für Antwort, Martin.

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: Frage zu MySQL 4.1 + charset (Verstehe es nicht mehr ganz!)

Post by isotopp » 2006-01-31 23:06

schröder wrote:Die MySQL habe ich aus der Box ohne Veränderungen übernommen und benutze auch keine *.cnf Datei.
Dein Pech. Dann sind sämtliche Puffer wahrscheinlich zu klein.
Hat auch funktioniert, obwohl der restore für eine 1.5 MB Datei mit knapp 30 Minuten auf einem Athlon 1200 sehr lange gedauert hat.
Ich korrigiere: Mit Sicherheit zu klein.
Frage 1: Meine Daten kommen alle ordentlich raus, das heißt ich kann diese Konfiguration (aber eigentlich ist ja nichts konfiguriert) so weiter benutzen?
root@localhost [(none)]> show variables like "%char%"G
*************************** 1. row ***************************
Variable_name: character_set_client
Value: utf8
*************************** 2. row ***************************
Variable_name: character_set_connection
Value: utf8
*************************** 3. row ***************************
Variable_name: character_set_database
Value: utf8
*************************** 4. row ***************************
Variable_name: character_set_results
Value: utf8
*************************** 5. row ***************************
Variable_name: character_set_server
Value: utf8
*************************** 6. row ***************************
Variable_name: character_set_system
Value: utf8
*************************** 7. row ***************************
Variable_name: character_sets_dir
Value: /usr/local/mysql-max-5.0.17-linux-i686-glibc23/share/mysql/charsets/
7 rows in set (0.00 sec)

Und bei Dir?


1. Wo sucht mein mysqld seine my.cnf?

Code: Select all

# /usr/local/mysql-max-5.0.17-linux-i686-glibc23/bin/mysqld --verbose --help | grep cnf
/etc/my.cnf ~/.my.cnf
2. Wo sucht mein mysql seine my.cnf?

Code: Select all

# /usr/local/mysql-max-5.0.17-linux-i686-glibc23/bin/mysql --help | grep cnf
/etc/my.cnf ~/.my.cnf
3. Wie setze ich den Charset für den Client und den Server?

In der my.cnf erzeuge einen Block client für die Client-Library und einen Block mysqld für den Server. Setze den Default-Charset:

Code: Select all

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8

[mysql]
prompt = u@h [d]>_
Bei der Gelegenheit solltest Du auch Deine Puffer in Deiner [mysqld]-Sektion anpassen. Und zwar mindestens key_buffer (MyISAM-Tabellen) oder innodb_buffer_pool_size (InnoDB).

Wie groß solltest Du key_buffer machen? Der key_buffer enthält Deine Indices (die stehen in den MYI-Dateien in datadir) und die Indices werden Dir mit SHOW TABLE STATUS als Index Length angezeigt. Es ist sinnlos, den key_buffer größer als Deine Indices zu machen.

Mit SHOW STATUS LIKE "key_read%"; werden Dir key_read_requests und key_reads angezeigt. Du solltest nach ca. einer Stunde Datenbanklaufzeit sehr viel mehr key_read_requests als key_reads haben (ca. 100-1000 mal mehr), wenn Dein key_buffer groß genug ist.

Wenn Du stattdessen InnoDB statt MyISAM verwendest, ist die Kenngröße die innodb_buffer_pool_size. InnoDB speichert Daten und Indices nicht getrennt wie MyISAM, sondern die Daten werden in Primary Key Order als Blätter des Primary Key Baumes angeordnet. Das entspricht in Oracle-Begriffen einem Clustered Index auf den PK.

Weil das so ist, muß der InnoDB Buffer Pool auch Daten statt nur Indices halten, und kann so bis zu 70% des Hauptspeichers umfassen (dafür braucht man fast keinen Filesystem Buffer Cache mehr, der bei MyISAM recht wichtig ist). Es ist sinnlos, den InnoDB Buffer Pool größer als die Datenbank selbst zu machen.

Du solltest dann außerdem noch mal über den Query Cache und seine Größe nachdenken, über den Table Cache und den Thread Cache. Das alles kann Deine Performance noch weiter verbessern.
Frage 2: Mit phpMyAdmin habe ich die Systeminfos auf der Unix Maschine mir anzeigen lassen, hier ein Screenshot http://home.arcor.de/nhz6/mysql1.jpg . Wie kann ich die Einstellungen optimieren, wenn das überhaupt möglich ist?
Deine Datenbank ist als latin1 angelegt. ALTER DATABASE CHARACTER SET=utf8. Dann werden Deine Tables aber alle als latin1 angezeigt werden, denn die haben das bei der Erzeugung ja von der Database geerbt. Also für alle Tables ALTER TABLE t CHARCTER SET=utf8. Dann werden Deine VARCHAR aber alle als latin1 angezeigt, denn die haben das ja von der Table geerbt. Also für jede VARCHAR column ALTER TABLE t CHANGE COLUMN c c VARCHAR(...) NOT NULL CHARACTER SET=utf8. Ja, das tut weh. Deswegen macht man das gleich ordentlich...[/quote]