Ich habe in meinem Shop mit gut 3500 Artikeln (leider noch nicht online) in folgenden Tabellen zindestens ein paar Hundert Tupel bis hin zu knapp 7000...
products_to_categories(pk:products_id*,categories_id*,index:categories_id)
products_description(pk:products_id,language_id*,index:language_id,products_name*)
products(pk:products_id*,index:products_ean(?),manufacturers_id)
personal_offers_by_customers_status_n(pk:price_id*,index:products_id)
categories_description(pk:categories_id*,language_id*,index:language_id,categories_name*)
categories(pk:categories_id*,index:parent_id*)
Vor der Klammer steht die Tabelle. Der PK ist der Primärschlüßel den die Tabellen aktuell verwenden. Index steht für Attribute die auf den ersten Blick sinn machen.
Die Attribute mit * verfügen bereits über einen Index.
Aus der MySQL-Doku ist zu entnehmen, dass ein zusammengesetzes PK von Links aus "greift".
Als kleines Beispiel:
products_to_categories(pk:products_id*,categories_id*,index:categories_id)
1. SELECT * FROM products_to_categories WHERE products_id=10;
2. SELECT * FROM products_to_categories WHERE products_id=10 AND categories_id=5;
3. SELECT * FROM products_to_categories WHERE categories_id=5;
Der erste und zweite Select verwenden den Index und würden den Zugriff beschleuningen, da die Index-Eintrag von links aus evaluiert werden.
Der dritte Select würde ohne den zusätzlichen Index ins leere fassen, da bei der PK-Eintrag von links aus evaluiert wird und keine entsprechende Information enthält. Wird jetzt der Index auf categories_id gelegt, hätten wir wiederum einen treffer und der Zugriff wird beschleunigt.
Ich würde diese ganzen zusammengessetzen Indizes wirklich nur dann anwenden, wenn sie in der Form auch in einer Where-Klausel vorkommen. Ansonsten würden sie nur helfen, wenn sie als Unique eingesetzt würden und ein Insert verhindern sollen... geschmackssache
![icon_smilenew :)](https://www.modified-shop.org/forum/Smileys/greensmilies/icon_smilenew.gif.pagespeed.ce.o4y9S19pKd.gif)
Im Grunde lässt sich sehr genau klären wo Indizes sinn machen, indem man jeden SQL-Statment mit EXPLAIN ausführt und sich das Ergebnis anschaut... Anonsten könnte ein beherztes grep auf WHERE/JOIN .. ON helfen um zu schauen worauf jeweil gematched wird.
Gruß
kopfpilot