2012-04-13 4 views
1

Ich benutze die lsqlite3 Lua Wrapper und ich mache Abfragen in eine Datenbank. Meine DB hat ~ 5 Millionen Zeilen und der Code, den ich Zeilen abzurufen bin mit ähneln:lua und lsqlite3: Beschleunigung Select Anweisung

db = lsqlite3.open('mydb') 
local temp = {} 
local sql = "SELECT A,B FROM tab where FOO=BAR ORDER BY A DESC LIMIT N" 
for row in db:nrows(sql) do temp[row['key']] = row['col1'] end 

Wie man sehen kann ich versuche die oben N Zeilen in absteigender Reihenfolge nach FOO sortierten zu bekommen (ich will um die obersten Zeilen zu bekommen und dann die LIMIT nicht umgekehrt). Ich indizierte die Spalte A, aber es scheint nicht viel Unterschied zu machen. Wie kann ich das schneller machen?

Antwort

3

Sie müssen die Spalte indexieren, nach der Sie filtern (d. H. Mit der WHERE-Klausel). Der Grund ist, dass ORDER BY ins Spiel kommt nach Filterung, nicht umgekehrt.

Sie sollten wahrscheinlich einen Index für FOO erstellen.

Können Sie Ihr Tabellenschema posten?

UPDATE

Sie können auch die sqlite cache erhöhen, z.B .:

PRAGMA cache_size=100000 

Sie je nach verfügbaren Speicher und der Größe Ihrer Datenbank einstellen können.

UPDATE 2

ich Sie wollen ein besseres Verständnis davon, wie Ihre Abfrage von SQLite behandelt wird, können Sie es fragen Sie mit dem Abfrage-Plan zur Verfügung zu stellen:

http://www.sqlite.org/eqp.html

UPDATE 3

Ich habe Ihren Kontext nicht richtig mit meiner ersten Antwort verstanden. Wenn Sie ORDER BY auf einigen großen Datensatz sind, möchten Sie wahrscheinlich diesen Index verwenden, nicht die vorherige, so können Sie SQLite sagen, den Index nicht auf FOO auf diese Weise zu verwenden:

SELECT a, b FROM foo WHERE +a > 30 ORDER BY b 
+0

Ich kann nicht poste es genau, aber ... CREATE TABLE dp (p, d, m, m, d, gc, bd); CREATE INDEX mi_index EIN dp (mi); die Abfrage würde aussehen wie "Wählen Sie p, mi von dp wo d = bar Reihenfolgeby mi Grenze n" Danke für die Hilfe! – akobre01

+0

Ja, also vergleichen Sie mit, wenn Sie 'd' indizieren. –

+0

Ich indizierte die Spalte, die Sie vorgeschlagen haben, aber ich bekomme immer noch keine gute Leistung. Eine andere Sache zu berücksichtigen ist, dass ich ungefähr 20% -35% der Reihen in dieser Frage zurückgebe ... Ich muss irgendwie irgendwie blockieren? – akobre01