Problem mit MySQL-Performance

*Rob*

Newbie
Registriert
Mai 2007
Beiträge
3
Hallo,

ich habe ein riesen Problem mit der Geschwindigkeit einer mySQL-Abfrage, vielleicht könnt ihr mir helfen...

Die Tabelle hat rund 758000 Datensätze gespeichert, es handelt sich hierbei um ein Gästebuch.

Verschiedene Gästebücher greifen nun auf diese Tabelle zu. Z.b. wenn nur einträge von "BenutzerA" angezeigt werden soll, wird einfach die Abfrage mit "WHERE `anGB` = 'BenutzerA'" ausgeführt...

Je mehr Gästebucheinträge nun ein Benutzer hat, desto länger brauch es um das Gästebuch zu laden... Das geht hoch bis zu 10 Sekunden, das ist eindeutig zu lang... :(

Ansonsten gibt es auf diesen Seiten keine weiteren Abfragen, nur diese!

Auf das Feld `anGB` habe ich auch schon einen Index gesetzt...

DB-Typ ist "MyISAM" ...


Ich hoffe ihr könnt mir helfen! :)
 
Welcher Datentyp ist anGB?

Zeig mal die Struktur aller Tabellen... kannst ja einfach ein create-Script erstellen!

Gruss
 
CREATE TABLE `gaestebuch` (
`ID` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`von` VARCHAR( 25 ) NOT NULL ,
`anGB` VARCHAR( 25 ) NOT NULL ,
`eintrag` TEXT NOT NULL
) ENGINE = MYISAM ;

Cool, dass es hier Leute gibt, die auch versuchen anderen zu helfen... :)
 
Zuletzt bearbeitet:
anGB sollte ein numerischer Typ sein und den eineindeutigen Schlüssen des Besitzers enthalten, nicht dessen Namen. MySQL kann zwar auch literale Spaltentypen indizieren, jedoch ist die Performance gelinde gesagt im Vergleich zu numerischen Spaltentypen unter aller Sau, Performance-Vergleiche der selben Tabelle mit numerischen und literalen Indizes haben enorme Differenzen zu Gunsten der numerischen Indizes aufgezeigt.
In deinem Fall kommt noch hinzu, daß anGB überhaupt nicht indiziert wird, daher wird bei jeder Suche ein Fullscan ausgeführt, was sich durch die Indizierung der Spalte deutlich verbessern ließe.

greetings, Keita
 
Du kannst z.B. eine Tabelle books machen
int gbid
varchar(25) anGB

dann per

Code:
select * from gaestebuch where gbid=(select gbid from books where anGB = 'BenutzerA')

Habs jetzt mal im Syntax von MSSQL gemacht sollte bei dir aber gleich sein!
 
Ah okay, ich werds mal ausprobieren... vielen dank! :)
 
Hallo,

eine Abfrage wie von davidbaumann empfohlen würde ich mit MySQL nicht empfehlen. Das kann der Server nicht so super optimieren.

Viel wichtiger sind wie schon erwähnt, dass die Spalte mit dem Gästebuchbesitzer numerisch wird, und ein Key drauf kommt. Ich selber habe auf einer Seite ein GB-System mit so einer Tabelle laufen, und das klappt wunderbar, auch noch mit wie bei meiner Tabelle mit ca 27.200.000 Einträgen. Hier mal die Struktur und Keys des Dings:
Code:
+---------+------------+------+-----+---------+----------------+
| Field   | Type       | Null | Key | Default | Extra          |
+---------+------------+------+-----+---------+----------------+
| gbeid   | int(11)    | NO   | PRI | NULL    | auto_increment |
| gb      | int(11)    | YES  | MUL | NULL    |                |
| poster  | int(11)    | YES  | MUL | NULL    |                |
| eintrag | text       | YES  |     | NULL    |                |
| antwort | text       | YES  |     | NULL    |                |
| rdate   | bigint(20) | YES  |     | NULL    |                |
| deleted | tinyint(1) | YES  |     | 0       |                |
+---------+------------+------+-----+---------+----------------+

Code:
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table         | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| gb            |          0 | PRIMARY  |            1 | gbeid       | A         |    27208015 |     NULL | NULL   |      | BTREE      |         |
| gb            |          1 | poster   |            1 | poster      | A         |      152000 |     NULL | NULL   | YES  | BTREE      |         |
| gb            |          1 | gbkey    |            1 | gb          | A         |      212562 |     NULL | NULL   | YES  | BTREE      |         |
| gb            |          1 | gbkey    |            2 | deleted     | A         |      212562 |     NULL | NULL   | YES  | BTREE      |         |
| gb            |          1 | gbkey    |            3 | gbeid       | A         |    27208015 |     NULL | NULL   |      | BTREE      |         |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

Ich hoffe das hilft weiter.

Gruß Tobi
 
Zuletzt bearbeitet:
Zurück
Oben