Frage

Ich habe eine MySQL-Tabelle, die hat unter anderen Attributen, einen Zeitstempel, einen Typ und ein user_id.
Alle von ihnen sind durchsuchbar und / oder sortierbar.
Ist es besser, einen Index für jeden, oder erstellen Sie eine einzelne Verbindung Index mit allen drei, oder beides?

erstellen
War es hilfreich?

Lösung

Pablo Antwort ist richtig, aber vielleicht werden Sie erkennen nicht, dass man eine Verbindung Index gerechtfertigt sein könnte.

Sie können mehrere Indizes haben und idx1(tstamp, user_id) mit schließt nicht aus indx2(tstamp, type) oder idx1reverse(user_id, tstamp) mit und so weiter ...

Compound-Indizes sind am nützlichsten, wenn sie alle Bedingungen in der Abfrage abdecken, so der Index, den Sie vorschlagen wird am nützlichsten für

SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type

Wenn Sie die Leistung solcher Abfragen verbessern Sie betrachten können, einen zusammengesetzten Index hinzugefügt wird.

Der Nachteil des Indizes ist, dass es alle Operationen Update verlangsamt. Allerdings sind die meisten allgemeinen Anwendungen viele mehr wählt dann tun Aktualisierungen (sowohl in Bezug auf Transaktionen, dh Anzahl der Aussagen und vor allem in Bezug auf die von Datensätzen betroffen / abgerufen) und zugleich sind viel toleranter langsamer Aktualisierungen (Benutzer meist beurteilen die Geschwindigkeit das System nicht von der Zeit ist es notwendig, einen Datensatz zu aktualisieren, sondern durch die Zeit, die notwendig Datensätze abzurufen,. wieder YMMV und es gibt Anwendungen, die durch eine solche Regelung nicht spielen)

Am besten wäre es, wenn Sie eine Möglichkeit haben die Datenbank-Performance in Bezug auf den typischen Workloads zu testen (erstellen einig typischen SQL-Skripte, unabhängige und wiederholbare oder Unit-Tests auf Anwendungsebene erstellen) und dann können Sie objektiv stimmen Sie Ihre Datenbank .

Bearbeiten auch erkennen, dass Indizes können hinzugefügt, und fallen gelassen werden, ohne das System in Bezug auf Funktionalität zu beeinträchtigen. Daher können Sie Ihre Indizes Melodie später, während die tatsächliche Nutzung des Systems -. Und normalerweise würden Sie sammeln und profilieren, die langsamen SQL-Abfragen für Bedingungen suchen, die von Hinzufügen von Indizes profitieren könnten

Andere Tipps

Wenn Sie gehen, sucht auf diesen Feldern separat durchzuführen, müssen Sie wahrscheinlich getrennten Indizes Ihre Anfragen schneller laufen zu machen.

Wenn Sie einen Index wie folgt aussehen:

mysql> create index my_idx on my_table(tstamp, user_id, type);

Und Sie Abfrage lautet:

mysql> select * from my_table where type = 'A';

Dann my_idx wird nicht hilfreich sein für Ihre Anfrage und MySQL wird dabei einen vollständigen Tabellenscan am Ende, um es zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top