Geschwindigkeit optimieren Nummer 2

MySQL, PostgreSQL, SQLite
sllnd
Posts: 177
Joined: 2002-10-14 22:33

Geschwindigkeit optimieren Nummer 2

Post by sllnd » 2005-08-15 23:29

Hallo,

ich habe ungefähr das selbe Prob wie mein Vorschreiber aus dem anderen Thread nur bei mir geht der Server schon bei 2-3 Besuchern in die Knie.

Also der Server ist ein Dual Intel Xeon mit 2,8Ghz, 4GB RAM und läuft Auf RedHat Enterpise 3.
MySQL ist 4.0.18, PHP 4.3.10 und Apache 2.0.46

Die Tabelle in der Datenbank welche 3GB groß ist nennen wir mal test, die hat 2Mio Einträge (230MB).

Jetzt habe ich einen Login Bereich, und der Benutzer gibt seine Daten ein also Passwort und Benutzername und die Verifizierung dauert sage und schreibe 20 Sekunden. Alle anderen Seiten von dem Server, welche sich auch auf diese Datenbank beziehen funktionieren perfekt ohne jeglicher Performance Probleme.

Hier mal meine MySQL Konfig, welche ich aus "mysql-huge.cnf" genommen habe und dort die query_size_* auf 512M gesetzt habe.

Code: Select all

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_connections=256

[mysql.server]
user=mysql
basedir=/var/lib
# The MySQL server
[mysqld]
port            = 3306
datadir=/var/lib/mysql
socket          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
max_connection = 256
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache = 8
#query_cache_size = 32M
query_cache_limit = 512M
query_cache_size = 512M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 4
Kann man diese 230MB große Tabelle nicht in irgendeiner Weise cachen, oder dem MySQL Server expliziet sagen, dass er genau diese vorspeichern soll.

Bei dieser Abfrage wird ledilich ein "SELECT Benutzername=$Benutzer & Passwort=$Passwort" Befehl ausgeführt, was ja eigentlich im Normalfall nicht das schlimm sein sollte.

Bei dieser Abfrage geht die Server Load bei diesem Server bei einem einzigen Besucher auf 0.8 bis 1.0 hoch und das bei solch einem System, was ja eigentlich nicht sein _darf_.

Hat irgendjemand einen Tipp, wie man den derzeitigen Zustand verbessern kann?

Vielen Dank und Gruß
SllnD

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Geschwindigkeit optimieren Nummer 2

Post by alexander newald » 2005-08-16 03:57

wenn die Abfrage beim Login läuft ein

mysql> show full processlist;

und dann aus der Spate Info die Abfrage kopieren und ein

mysql> explain ABFRAGE

machen und das posten

sllnd
Posts: 177
Joined: 2002-10-14 22:33

Re: Geschwindigkeit optimieren Nummer 2

Post by sllnd » 2005-08-16 09:55

Code: Select all

+----+-------------+-------+------+----------------+---------+---------+------------------+-------+-------------+
| id | select_type | table | type | possible_keys  | key     | key_len | ref              | rows  | Extra       |
+----+-------------+-------+------+----------------+---------+---------+------------------+-------+-------------+
|  1 | SIMPLE      | t3    | ref  | usernr,feldbez | feldbez |      25 | const            | 23452 | Using where |
|  1 | SIMPLE      | t2    | ref  | usernr,feldbez | usernr  |       4 | datenbank.t3.usernr |   120 | Using where |
|  1 | SIMPLE      | t1    | ref  | usernr,feldbez | usernr  |       4 | datenbank.t2.usernr |   120 | Using where |
+----+-------------+-------+------+----------------+---------+---------+------------------+-------+-------------+
3 rows in set (0.01 sec)

stefanpropehan
Posts: 335
Joined: 2002-12-17 22:25
Location: Berlin

Re: Geschwindigkeit optimieren Nummer 2

Post by stefanpropehan » 2005-08-16 11:19

Ich wiederhole mal noch einmal meine Aussage von Gestern...

Du must die Querys herrausfinden die denn Server in die Knie zwingen... dies geht am besten über die MYSQL Konfigurations Parameter "long_query_time" und "log-slow-queries"...

Warum werden deine Tabellen über 230 MB groß, poste mal das Tabellen Layout... BLOBs und CO ohne Ende? Was wird darin gespeichert?

Stefan

outofbound
Posts: 470
Joined: 2002-05-14 13:02
Location: Karlsruhe City

Re: Geschwindigkeit optimieren Nummer 2

Post by outofbound » 2005-08-16 12:23

a) Querries posten
b) Tabellenlayout posten

Das Problem ist zu 99,9999% ein Designfehler, mit irgendwelchen Optionen oder so drumrumzupatchen ist nur Symptombekämpfung.

Gruss,

Out

sllnd
Posts: 177
Joined: 2002-10-14 22:33

Re: Geschwindigkeit optimieren Nummer 2

Post by sllnd » 2005-08-16 13:08

OutOfBound wrote:a) Querries posten
b) Tabellenlayout posten

Das Problem ist zu 99,9999% ein Designfehler, mit irgendwelchen Optionen oder so drumrumzupatchen ist nur Symptombekämpfung.

Gruss,

Out
a)

Code: Select all

SELECT t1.usernr FROM tabelle t1 INNER JOIN tabelle t2 USING ( usernr ) INNER JOIN tabelle t3 USING ( usernr ) WHERE t1.feldbez = 'login' AND t1.ergvalue = 'benutzer' AND t2.feldbez = 'passwort' AND t2.ergvalue = 'passwort' AND (t3.feldbez = 'sperre' and t3.ergvalue ='2' || t3.feldbez = 'sperre' and t3.ergvalue ='N')
b) Tabellenlayout:

Code: Select all

   
tmpid          int(11)     Nein    auto_increment              
jobnr          int(11)     Nein  0                
usernr         int(11)     Nein  0                
feldbez        varchar(25) latin1_swedish_ci   Nein                  
ergvalue      text latin1_swedish_ci   Nein                  
angelegtam    date     Nein  0000-00-00                
geaendertam   timestamp     Ja  0000-00-00 00:00:00                
angelegtvon   varchar(50) latin1_swedish_ci   Nein                  
geaendertvon  varchar(50) latin1_swedish_ci   Nein      
An dem layout kann ich leider wenig ändern, das SQL Statement ist anpassbar.

larsinho
Posts: 14
Joined: 2004-04-14 20:21

Re: Geschwindigkeit optimieren Nummer 2

Post by larsinho » 2005-08-16 22:52

Sehe ich das richtig? In der - ich nenne sie mal so - User-Tabelle gibt es zu jedem User mehrere Zeilen? Und Indexe sind nirgends gesetzt?

outofbound
Posts: 470
Joined: 2002-05-14 13:02
Location: Karlsruhe City

Re: Geschwindigkeit optimieren Nummer 2

Post by outofbound » 2005-08-17 13:52

Oehm, doofe Frage: Wer hat denn sowas verbrochen?????

Ich meine, die grundsätzliche Idee dahinter kenne ich, und
auch die Vor- und Nachteile, aber gesehen hab ich das schon
länger nicht mehr... das erinnert mich auch irgendwie an SAP...

Also, Indices setzen.... man müsste sich mal die
Datenverteilung anschauen, aber ich würde mal auf
usernr (Weil da joinst du drüber) und feldbez gucken.
Das kommt natürlich noch drauf an, wie viel in diese Tabelle
reingeschrieben wird...

[edit] Ah, im explain steht ja drin, dass da keys gesetzt sind...
Ignorier den obigen Absatz. ;) [/edit]

Bei dieser Struktur wirst du um solche selects leider
net drum rum kommen, und ich empfehle dir ganz dringend, etwas
gegen solche Monster zu unternehmen... Den Query umzustricken ist
da so eine Sache...

Gruss,

Out