Mysql 5 - Verständnisfragen zu Indizes und Feldreihenfolgen

parawaiter

Mitglied
Hi,

ich beschäftige mich seit kurzem mit Mysql in Verbindung mit PHP und habe ein paar Fragen dazu.

Wenn ich beispielsweise eine Tabelle namens 'artikel' mit folgender Struktur habe:
artikel_id (PRIMARY) | artikelnummer | artikelgewicht | artikelstatus | artikelsortierung

Hat es einen Einfluss auf die Geschwindigkeit in welcher Reihenfolge ich die Felder auslese?


Jetzt zu den Indizes :)
Angenommen ich habe folgende Tabellen:

Tabelle -> artikel
artikel_id (PRIMARY) | hersteller_id

Tabelle -> hersteller
hersteller_id (PRIMARY) | hersteller_name | hersteller_beschreibung

Jetzt will ich einem Artikel entsprechend den Namen und die Beschreibung des Herstellers ausgeben.
PHP:
$query = mysql_query("SELECT h.hersteller_name, h.hersteller_beschreibung
                             FROM artikel AS a
                             LEFT JOIN hersteller AS h ON (a.hersteller_id = h.hersteller_id)
                             WHERE artikel_id = irgendeine_artikel_id");
Da ich obwohl ich schon einiges dazu gelesen habe sehr wenig vom einsetzen von Indizes verstehe würde mich einfach interessieren wie Ihr sie in dem Fall für die beiden Tabellen einsetzen würdet.

Ich würde mich sehr über Tipps und Anregungen freuen :)

Gruß
parawaiter
 
Hat es einen Einfluss auf die Geschwindigkeit in welcher Reihenfolge ich die Felder auslese
die Reihenfolge im select meinst du? nö.


Bei deiner where Bedingung ist wichtig, dass ein Index existiert, bei dem das 1 Feld die Artikel Id ist.
die Reihenfolge der Felder im Index ist also sehr wichtig.

Ich glaub auch in MySql wird ja Standardmässig auf den PrimaryKey einer Tabelle ein Index erstellt. von daher gibts bei deinem Select nix mehr zu optiieren
 
Hi,

vielen Dank, das spart mir schonmal einiges an Sortierarbeit :)

Jetzt würde mich noch interessieren ob es einen unterschied macht, wenn ich Indizes so...
PHP:
ALTER TABLE hersteller ADD INDEX ( hersteller_id , hersteller_name);
ALTER TABLE hersteller ADD INDEX ( hersteller_id , hersteller_beschreibung);
oder direkt so...
PHP:
ALTER TABLE hersteller ADD INDEX ( hersteller_id , hersteller_name, hersteller_beschreibung);
einfüge?

Gruß
parawaiter
 
Moin parawaiter,

nein, macht keinen Unterschied.
Alle drei Varianten sind Unsinn. ;-)

Da HerstellerID ein eindeutig identifizierender Schlüssel ist, wirst Du als alleiniges Sortierkriterium immer nur "HerstellerID" brauchen. Auch im Index.

Was Du wohl ZUSÄTZLICH anlegen willst, ist als Sortierindex vielleicht noch einen Index auf Herstellername einbauen [....ADD INDEX ( hesrsteller_name). ].
Wäre vertretbar und sinnvoll.
Dann kannst Du auch nach Hersteller "Heinz" suchen, wenn Du die HerstellerID nicht im Kopf hast.

Ein Index auf "Herstellerbeschreibung" dagegen... wozu?
Wenn bei "Beschreibung" meinetwegen "Familienunternehmen seit 1598" steht oder "Maschinen und Diverses" oder "Ton, Steine, Scherben"... Falls Du dort etwas suchst, wirst Du ohnehin eine LIKE-Suche machen.
Da nützt Dir ein Index nichts, das wird ohnehin ein Full Table Scan.
Und was soll's: bei der anzunehmenden Größe einer "Hersteller"-Datei hast Du da keine 20 Sätze drin.
Dort also kein Index.

Grüße
Biber
 
Zuletzt bearbeitet:
Hi Biber,

ok, gut zu wissen, so langsam blick ich (glaub ich zumindest) ein bisschen durch :)
Wenn ich das richtig verstanden habe braucht man im Normalfall Indizes nur für die Felder mit denen man in einer WHERE-Bedingung und in JOINS vergleicht, also wäre es z.B. bei der Tabelle "artikel" sinvoll einen Index für das Feld "hersteller_id" zu setzen, oder?

Ich hoffe ich quäle dich nicht zu sehr mit meiner Fragerei ;-)

Gruß
parawaiter
 
Moin parawaiter,

jepp, ich glaube, jetzt hast Du das Prinzip verstanden.

Indices sind entweder
* durch die logischen Beziehungen (Relationen, ForeignKeys,...) vorgegeben
--> Keine ArtikelID darf auf 0 oder 27 HerstellerIDs verweisen--> es muss genau eine sein.

Und die Eindeutigkeit (Uniqueness) von IDs kannst Du natürlich am Besten mit über den PK erledigen.

Alle anderen Indices sind reine Such/Sortierindices, die Perfrmance bringen könnten.
Z.B. ein Index auf ein Textfeld [Hersteller_name].
Diese Indices müssen aber nicht eindeutig sein (wenn drei Firmen "Meier" heißen, dann kannst Du von denen keine Namensänderung verlangen).

Ob es sinnvoll/nötig ist, diese Felder zu indizieren, das hängt davon ab,
* wie oft Du in/nach diesen Feldern suchst
* wie viele Datensätze vorhanden sind.

[10000 Kunden-Namen indizieren... okay.
3 Filialnamen oder 2 Ländernamen indizieren.... ist sagen wir mal nicht verboten]

Aber wenn "Index auf einem Textfeld", dann sollte es ein Feld "Matchcode" oder ähnlich sein, in dem nur GROSS geschriebene vereinfachte Kurznamen sind.
Beispiel "Matchcode" für den Hersteller "Max Bahr Baumarkt "--"BAHR".

Grüße
Biber
 
Zurück