MySql Query Optimierung

cgde

New Member
Ich habe mal eine außergewöhnlich einfache Frage die ich anscheinend einfach nicht begreife.

Ich habe eine Query wie folgt:
Code:
SELECT id, roomid, roomname, roomowner, roomusers, roomcreated, roomicon  
				  FROM rooms 
				  WHERE roomname != 'User Room'
				  ORDER BY ABS(id) ASC;

In der Tabelle sind 11 Einträge mit verschiedenen Raumnamen.
Ein index für die Spalten roomname und primary sind gesetzt.
Überprüfe ich allerdings diese Abfrage, bekomme ich ein komisches Ergebnis
das wie folgt mit explain ausschaut.

Code:
id 	select_type    table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 	
1 	SIMPLE 	    rooms 	ALL 	roomname           NULL NULL          NULL	 11 	Using where; Using filesort

Anscheinend wird der index gar nicht erst benutzt? Aber warum?
Gibt es eine bessere Möglichkeit diesen Query zu optimieren?
 
Last edited by a moderator:

marce

Well-Known Member
MySQL verwendet die Indices bei kleinen Datenmengen (ca. alles unter 100 Einträgen) nicht und macht dann einfach einen FTS - weil's von der Geschwindigkeit keinen Unterschied macht.

Näheres dazu steht in der MySQL-Doku.

Ansonsten - bei einer solch einfachen Query gibt's auch nicht viel zu optimieren. Je nach dem, was man mit dem Ergebnis machen will verzichtet man ggf. noch auf das order aber mehr kannst Du ja nicht weglassen.
 
Last edited by a moderator:

cgde

New Member
Ja darum frag ich ja nach.
Das was mich nervt ist, das er aufgrund des FTS ständig die slow_log vollmüllt.
Aber auch gut zu wissen das er unter 100 Einträgen keinen index nutzt. Danke
 

Joe User

Zentrum der Macht
Du kannst auch Dummy-Rows anlegen, musst aber dann schauen ob sie die Performance trotz Index-Nutzung nicht verschlechtern.
 

marce

Well-Known Member
wobei ich mich ein wenig wundere, wie eine solche Query im SlowQuery-Log auftauchen kann. Da stimmt dann eher grundlegend was nicht (QueryCache oder sowas in der Art greift nicht)...
 

Joe User

Zentrum der Macht
Eine vernünftige my.cnf enthält im Abschnitt mysqld die Option log-queries-not-using-indexes und dann landet die Query in diesem Fall ordnungsgemäss im Log.
 
Last edited by a moderator:

marce

Well-Known Member
ok, wäre eine Option - die LogEinstellung nutze ich nicht dauerhaft auf prod. Systemen.

Wobei die Doku auch sagt:
The server does not write queries handled by the query cache to the slow query log

Das Auftreten einer Query im Log durch not-using-indexes ist aber nicht grundsätzlich ein Problem, kann aber auf eines Hindeuten.
 
Last edited by a moderator:

Joe User

Zentrum der Macht
Die Query ist so simple, dass ich vermute, dass sie gar nicht im Query-Cache landet und wenn doch, dann dürfte der Query-Cache so gar negative Auswirkungen haben.
Deaktivieren des Query-Cache kann durchaus zur Performancesteigerung beitragen.
 

marce

Well-Known Member
Was ist denn nun eigentlich das konkrete Problem? Ist die Abfrage langsam / dauert lange? Oder stört Dich einfach nur, daß sie im Log auftaucht, obwohl sie schnell abgearbeitet wird?
 
Top