2016-04-25 14 views
0

Nehmen wir an, Sie haben eine Tabelle mit id,a,b,c,d,e,f,g mit rund 1 Million Zeilen. Dann könnte man eine Abfrage mit mehreren WHERE ...AND...AND...etc Bedingungen in mehreren Kombinationen machen. Das ist zum Beispiel a AND b AND e oder a AND f AND g oder e AND f AND g.Mehrere oder einzelne zusammengesetzte Index

Also um alle Kombinationen zu berücksichtigen, müssten Sie mehrere zusammengesetzte Indizes erstellen, aber was, wenn a,b,c,d,e,f,g einen Bereich von [1,10] daher keine Null haben.

Könnte man einfach eine einzelne Verbindung pro Start variabel machen, so a,b,c,d,e,f,g und b,a,c,d,e,f,g etc .. und die während der Abfragezeit wie etwas tun

#b and e have not been chosen 
    SELECT * FROM WHERE a=3 AND b!=0 AND c=4 AND d=5 AND e!=0 AND f=1 AND g=9 
    #I think you get the logic 

Könnte eine solche Prozedur erlauben mysql noch die Verbindung Index zu verwenden oder ich tun müssen wirklich alle möglichen Kombinationen von zusammengesetzten Indizes erstellen.

Das Endergebnis würde die Anzahl der Indizes bis 7 statt Anzahl von links Kombinationen possibles reduzieren, die höher ist als Weg 7.

+2

Diese Art von Problem ist manchmal symptomatisch für einen Mangel an Normalisierung – Strawberry

+0

Es ist die Simulation einer materialisierten Ansicht in Mysql daher die hohe Anzahl der Spalten. – delmalki

+0

Erdbeere hat einen Punkt der Normalisierung, vorausgesetzt, Ihre a-g-Spalten haben alle denselben Kontext.Wenn Ihre Daten jedoch jeweils eine a-g-Spalte haben, haben Sie einen eigenen normalisierten Wert - wie in einer Tabelle mit den Govt-Verträgen, mit der ich gearbeitet habe. Die Wurzeltabelle hatte Links zu mehr als 20 individuellen Referenztabellen, die jeweils auf ID normiert waren. Wenn Sie mehr als den generischen a-g-Kontext erweitern können, könnten wir Ihnen eine bessere Klärung und Eingabe für Ihre Situation bieten. – DRapp

Antwort

2

MySQL Verbindung Indizes verwenden, um, wenn er kann. Wenn also Ihre Daten eine Taxonomie darstellen, reicht ein einzelner Index aus. Lassen Sie uns sagen Kunden können entweder geschäftlich oder privat eingeben und in einer bestimmten Postleitzahl leben und Status Prämie oder regelmäßig sein, dann eine Abfrage wie

SELECT * FROM customer 
WHERE type = 'business' 
AND postal_code = '12345' 
AND status = 'premium'; 

wäre in der Lage, einen Index zu verwenden, basierend auf einer Verbindung Schlüssel gebaut von type + postal_code + status. Wenn Sie status nicht kannten, wäre der Index immer noch nützlich. Aber wenn Sie nur wussten postal_code, aber nicht type, würde der Index nicht verwendet werden - Bestellung zählt.

Aber ich stimme dem Kommentar von Strawberry - das ist in der Regel kein Problem in einem standardmäßigen relationalen Schema. Es ist nicht ungewöhnlich, mehrere Fremdschlüssel in einer Tabelle zu haben, aber wenn Sie nicht gerade einen Datenwürfel oder ein anderes spezielles Design erstellen, ist dieses Problem einfach nicht das, was Sie wahrscheinlich haben sollten - sicherlich nicht mit 7 Feldern.

Wenn dies jedoch ein echtes Problem ist, berücksichtigen Sie den Wert jedes potenziell indizierten Felds. Wenn die meisten Abfragen in der Lage sind, die Millionen Zeilen auf mehrere Tausend zu reduzieren, indem mehrere Indizes verwendet werden (zusammengesetzt oder nicht), kann der endgültige Scan trivial sein. Experimentieren Sie mit EXPLAIN PLAN, um zu sehen, ab wann es bei den meisten Abfragen nicht mehr zählt.

Die Kosten für die Verwaltung eines Indexes können trivial sein ... oder auch nicht. In stark abgestimmten Transaktionssystemen würde ein einzelnes Einfügen, Aktualisieren oder Löschen zu N + 1 Schreibvorgängen führen: der eine für die Zeile und der andere N für jeden Index. Wenn Sie hauptsächlich lesen, dann ist das in Ordnung. Wenn nicht, könnte eine Kombination von zusammengesetzten Schlüsseln möglicherweise einen gewissen Nutzen haben, indem die Anzahl der Schreibvorgänge reduziert wird.

Aber ich arbeite seit mehr als ein paar Jahrzehnten mit relationalen Datenbank. Fälle, in denen dieses Szenario auftritt, wurden fast immer durch das Überdenken des Schemadesigns gelöst. Ich erinnere mich nicht an einen Fall, in dem ein zusammengesetzter Schlüssel mehr Sinn ergab als mehrere Indizes in einem typischen relationalen und gut normalisierten Schema.

Verwandte Themen