Wir haben die folgende Tabelle (in SQLite unter Android), die eine Baumstruktur (Nested Set-Modell) von Wörtern und deren Häufigkeit enthält:
lexikon
-------
_id integer PRIMARY KEY
word text
frequency integer
lset integer UNIQUE KEY
rset integer UNIQUE KEY
Und die Frage:
SELECT word
FROM lexikon
WHERE lset BETWEEN @Low AND @High
ORDER BY frequency DESC
LIMIT @N
Ich nehme an, ein Abdeckungsindex für (lset, frequency, word)
wäre nützlich, aber ich bin der Meinung, dass er möglicherweise nicht gut funktioniert, wenn zu viele lset
Werte im (@High, @Low)
Bereich vorhanden sind.
Ein einfacher Index für (frequency DESC)
kann manchmal auch ausreichend sein, wenn eine Suche mit diesem Index frühzeitig die @N
Zeilen ergibt, die der Bereichsbedingung entsprechen.
Es scheint jedoch, dass die Leistung stark von den Parameterwerten abhängt.
Gibt es eine Möglichkeit, eine schnelle Leistung zu erzielen, unabhängig davon, ob der Bereich (@Low, @High)
breit oder eng ist und ob die Wörter mit der höchsten Frequenz glücklicherweise im (engen) ausgewählten Bereich liegen?
quelle
frequency
Spalte geben?Antworten:
Ich würde sagen, versuchen Sie es mit diesem Deckungsindex (lset, Häufigkeit, Wort), aber Sie haben nicht viele Informationen gegeben. Bitte geben Sie an, wie viele Zeilen Ihre Tabelle hat, wie groß die Bytes sind, wie viele maximale Zeilen Sie von Ihrer Abfrage erwarten, wie hoch ist die Kardinalität Ihrer Daten?
quelle
LIMIT
würde in einigen Fällen einige tausend Zeilen und in anderen Fällen weniger als 10 Zeilen zurückgeben.