Durchführung der Abfrage mit einer Bereichsbedingung und Reihenfolge nach


8

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 lsetWerte 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 @NZeilen 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?


Können Sie einige Informationen zur Verteilung der Werte in der frequencySpalte geben?
Jack sagt, versuchen Sie es mit topanswers.xyz

Antworten:


1

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?


Die Tabelle enthält ca. 100.000 Zeilen. Die Abfrage ohne das LIMITwürde in einigen Fällen einige tausend Zeilen und in anderen Fällen weniger als 10 Zeilen zurückgeben.
Ypercubeᵀᴹ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.