php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.05.2011, 17:17  
Neuer Benutzer
 
Registriert seit: 26.07.2010
Beiträge: 11
PHP-Kenntnisse:
Fortgeschritten
stb2050 befindet sich auf einem aufstrebenden Ast
Standard Verständnis-Problem mit Explain & Performance-Optimierung

Hallo ihr Lieben,

um die Performance zu erhöhen, habe ich dir sloglog-Funktion so aktiviert, dass auch Querys auftauchen, die keine Indexe (oder nicht die optimalen?) nutzen.

Folgender Query taucht immer wieder auf:

Code:
SELECT
					rechte_objekte.modul as modul,
					module.titel as titel
				FROM
					rechte_seiten
				INNER JOIN
					rechte_objekte
					ON rechte_seiten.rechteobjekt = rechte_objekte.id
				INNER JOIN
					module
					ON module.id = rechte_objekte.modul
				WHERE
					rechte_seiten.seitenid = '2401';
Nun frage ich mich, warum er dort auftaucht. Die Ausgabe von EXPLAIN sieht wie folgt aus:



Hat jemand eine Idee? Es sieht ja erstmal so aus, als wären überall Indexe benutzt wurden, oder nicht? Oder sind die Einträge bei "Extra" das Problem? Und wenn ja, wie kann ich das beheben?

Liebe Grüße,
Steffen
stb2050 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.05.2011, 17:26  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Wie schaut der Index "Seitendaten" denn aus?

Grüße.
php1704 ist offline   Mit Zitat antworten
Alt 26.05.2011, 17:28  
Neuer Benutzer
 
Registriert seit: 26.07.2010
Beiträge: 11
PHP-Kenntnisse:
Fortgeschritten
stb2050 befindet sich auf einem aufstrebenden Ast
Standard

Der Index "Seitendaten" enthält 2 Spalten:

1. rechte_seiten.rechteobjekt
2. rechte_seiten.seitenid

LG,
Steffen
stb2050 ist offline   Mit Zitat antworten
Alt 26.05.2011, 17:44  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Mysql kann immer nur einen Index / Tabelle verwenden.

In deinem Fall wird hier für die Tabelle rechte_seiten der Index Seitendaten verwendet.

Für den Join mit rechte_objekte kann der dann auch verwendet werden.

Für das "WHERE rechte_seiten.seitenid = '2401'" allerdings nicht, weil der Index immer von Links nach Rechts verwendet werden kann.

Solange aber bei Extra aber kein "temporary" oder "Filesort" steht würd ich mir da nun aber nicht so viele Gedanken drum machen.

Grüße.
php1704 ist offline   Mit Zitat antworten
Alt 26.05.2011, 17:47  
Neuer Benutzer
 
Registriert seit: 26.07.2010
Beiträge: 11
PHP-Kenntnisse:
Fortgeschritten
stb2050 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von php1704 Beitrag anzeigen
Für das "WHERE rechte_seiten.seitenid = '2401'" allerdings nicht, weil der Index immer von Links nach Rechts verwendet werden kann.
Grüße.
Kannst du das mit dem "links nach rechts" nochmal genauer erklären? Das habe ich leider noch nicht wirklich verstanden.

Liebe Grüße,
Steffen
stb2050 ist offline   Mit Zitat antworten
Alt 26.05.2011, 17:56  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Gegeben sei eine Tabelle

table: id|name|datum

und die Indizies:

idx1: id,name
idx2: datum

Code:
SELECT * FROM table WHERE id = 1
Der Index "idx1" wird verwendet.

Code:
SELECT * FROM table WHERE name = 'heinz'
Kein index wird verwendet, da auf das 2. Feld im Index "idx1" nicht zugegriffen werden kann.

Code:
SELECT * FROM table WHERE id = 1 AND name = 'heinz'
Index "idx1" wird verwendet.

Code:
SELECT * FROM table WHERE name='heinz' AND id = 1
"idx1" wird nur für das "id = 1" verwendet, da nicht zuerst auf das Feld "name" im Index "idx1" zugegriffen werden kann.

Code:
SELECT * FROM table WHERE id = 1 AND name 'heinz' ORDER BY datum
Mysql entscheidet selbst, ob es "idx1" für das WHERE oder "idx2" für das Sortieren verwendet.

Grüße.
php1704 ist offline   Mit Zitat antworten
Alt 27.05.2011, 12:25  
Neuer Benutzer
 
Registriert seit: 26.07.2010
Beiträge: 11
PHP-Kenntnisse:
Fortgeschritten
stb2050 befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für die ausführliche Erklärung, das habe ich soweit verstanden

Bleiben noch zwei Fragen:

- Kann ich in deinem letzten Beispiel nicht noch "datum" mit in den Index aufnehmen, damit er auch für die Sortierung den Index verwendet?

-Wieso taucht der Query trotzdem noch in dem slowlog auf? Er verwendet doch scheinbar einen Index

Liebe Grüße,
Steffen
stb2050 ist offline   Mit Zitat antworten
Alt 28.05.2011, 02:51  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Zitat:
Zitat von stb2050 Beitrag anzeigen
- Kann ich in deinem letzten Beispiel nicht noch "datum" mit in den Index aufnehmen, damit er auch für die Sortierung den Index verwendet?
Auch hier gilt: von links nach rechts
Wenn du den Index zu "id,name,datum" erweiterst, dann kann dieser bei
Code:
ORDER BY id
ORDER BY id, name
ORDER BY id, name, datum
verwendet werden.

Bei diesen z.B. aber nicht:
Code:
ORDER BY datum
ORDER BY id, datum
ORDER BY datum, name, id
Zitat:
Zitat von stb2050 Beitrag anzeigen
-Wieso taucht der Query trotzdem noch in dem slowlog auf? Er verwendet doch scheinbar einen Index
Weil nicht für die komplette Query ein Index verwendet werden kann. In deinem Fall muss sich Mysql entscheiden ob es den Index für den JOIN verwendet oder den Teil im WEHRE.

Kannst du dein Eintrag aus dem slow-query-log mal posten? Da steht eigentlich wieso die rein kam.

Grüße.
php1704 ist offline   Mit Zitat antworten
Alt 30.05.2011, 17:35  
Neuer Benutzer
 
Registriert seit: 26.07.2010
Beiträge: 11
PHP-Kenntnisse:
Fortgeschritten
stb2050 befindet sich auf einem aufstrebenden Ast
Standard

Der Eintrag in der Log lautet wie folgt:

Code:
# User@Host: root[root] @ localhost [::1]
# Query_time: 0.000000  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 181
SET timestamp=1306422649;
SELECT
					rechte_objekte.modul as modul,
					module.titel as titel
				FROM
					rechte_seiten
				INNER JOIN
					rechte_objekte
					ON rechte_seiten.rechteobjekt = rechte_objekte.id
				INNER JOIN
					module
					ON module.id = rechte_objekte.modul
				WHERE
					rechte_seiten.seitenid = '2401';
Da steht also auch nicht viel drin. Vielleicht kann man das mit einer Einstellung noch erweitern?

Liebe Grüße,
Steffen
stb2050 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Group BY Problem oder keine Lösung dafür kingbods Datenbanken 5 11.03.2011 12:44
Performance Problem laszlokorte PHP-Fortgeschrittene 13 08.03.2011 08:33
Ein unverständliches Server Performance Problem da.eXecutoR PHP-Fortgeschrittene 14 14.02.2011 11:02
session_destroy() verständnis Problem Creator PHP Tipps 2010 3 01.08.2010 00:01
Problem mit swfobjects R4v3r JavaScript, Ajax und mehr 8 21.09.2008 14:17
include verständnis problem martl666 PHP Tipps 2008 24 18.09.2008 12:01
performance problem mit join leo Datenbanken 4 14.01.2008 22:31
DELETE Verständnis Problem [gelöst] wishy Datenbanken 8 02.05.2007 13:05
problem bei verständnis mit bildmanipulation Promaetheus PHP Tipps 2007 18 17.04.2007 15:18
ImageMagick Performance Problem M3g4Star PHP Tipps 2006 1 30.11.2006 09:35
Verständnis Problem 24bits PHP Tipps 2005-2 6 16.10.2005 23:00
[Erledigt] [LEFT JOIN] Verständnis Problem Datenbanken 6 17.06.2005 14:38
Verständnis Problem bei Übergabe von Arrays imported_dex PHP Tipps 2005 2 05.03.2005 18:03
like opeartor - performance problem Datenbanken 15 08.12.2004 03:48

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php explain

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum