Ich verwende Django, um einige Datenbanktabellen zu erstellen:
%Vor% Ich führe dann Suchabfragen durch, um die passende Zeile mit der korrekten term
zu finden, die ohne Berücksichtigung der Groß- / Kleinschreibung übereinstimmt. Zum Beispiel:
Diese Lookup-Klausel wird in SQL wie folgt übersetzt:
%Vor% Bei Postgres kann ich eine EXPLAIN
Abfrage auf dem obigen durchführen, und ich bekomme diesen Abfrageplan:
Da das Feld term
nicht indiziert ist und nicht nach einer Fall-normalisierten Methode indiziert wird, muss die obige Abfrage eine langsame Seq [utual] -Suchoperation über alle Datenbankzeilen hinweg durchführen.
Dann füge ich einen einfachen case-normierten Index ein, zum Beispiel:
%Vor%Die obige Abfrage läuft jetzt etwa 6x schneller ab:
%Vor%Meine Frage ist: Wie kann ich die Erstellung fortgeschrittener DB-Indizes in die Django-Modellverwaltungsbefehle einfügen?
Vor Django 1.9 (noch nicht veröffentlicht) könnten Sie den Befehl sqlcustom verwenden, aber wenn Sie sich die Entwicklerdokumentation für das kommende 1.9 ansehen, werden Sie sehen, dass dieser Befehl auffallend fehlt.
Django 1.11 (2.0 sollte auch in Ordnung sein) + PostgreSQL:
Erstellen Sie zuerst eine leere Migration:
%Vor% Django verwendet UPPER
für ungenaue Suchvorgänge. Erstellen Sie daher eine Migration, um einen UPPER(yourField)
index hinzuzufügen:
Um benutzerdefinierte SQL in die Django-Modellverwaltungsbefehle einzufügen, django- admin.py sqlcustom
Sie würden eine SQL-Datei mit Ihrem Erstellungsindex in <app_name>/sql/<model_name>.sql
Aus den Dokumenten, wenn sie angewendet werden:
Die SQL-Dateien werden direkt nach der Installation in die Datenbank piped Die Tabellenerstellungsanweisungen der Modelle wurden ausgeführt. Verwenden Sie diese SQL haken, um Tabellenänderungen vorzunehmen oder SQL-Funktionen einzufügen die Datenbank.
Und Sie können die benutzerdefinierte SQL für jede App anzeigen, indem Sie manage.py sqlcustom <app_name>
Tags und Links django database indexing model django-models