Gegeben Ich habe einen großen Tisch in meiner lokalen SQLite-Datenbank (ca. 5'000'000 Zeilen) mit einem Schema wie diesesSqlite: Wie beschleunigt man diese Sqlite-Abfragen?
id
(integer, einzigartig), z.B. 6543
description
(Text), z.B. "any meaningful text"
tags
(Text), z.B. "(living)(home)(garden)"
Also, wenn ich brauche alle Einträge zählen getaggt ‚zu Hause‘ und ‚Garten‘, das tue ich
SELECT count(id) FROM tbl WHERE tags LIKE ‘%(home)%' AND tags LIKE '%(garden)%'
Offensichtlich ist dies nimmt wie immer. (Ich testete es mit einer 2'000'000 Einträge Tabelle Version und es dauerte 93 Sekunden ...)
Wäre es klug, neue Spalten einzuführen, eine für jedes Tag (fünf sind max)?
Also würde ich Spalten wie
id | description | tag1 | tag2 | tag3 | tag4 | tag5 34 | blahblah | home |garden| null | null | null
Die entsprechende Abfrage aussehen würde
SELECT count(id) FROM tbl WHERE (tag1 = 'home' OR tag2 = 'home' OR tag3 = 'home' OR tag4 = 'home' OR tag5 = 'home') AND (tag1 = 'garden' OR tag2 = 'garden' OR tag3 = 'garden' OR tag4 = 'garden' OR tag5 = 'garden')
Ist das wirklich besser?
Ich habe einfach keine Ahnung, was das Beste ist. Ich bin sicher, dass es eine Möglichkeit gibt, die Abfragezeit zu verringern ... Aber ich weiß es nicht.
Jede Hilfe würde sehr geschätzt werden!
Oder vielleicht haben Sie eine völlig neue Idee, wie Sie die Daten und/oder Abfrage umstrukturieren, um es schneller zu machen.
Vielen Dank im Voraus!
Es scheint mir, Sie sind ein MN Beziehung zwischen Tags und Tabl modellieren. Sie könnten diese Tags in eine Tabelle einfügen: 'CREATE TABLE tbl_tags (tbl_id INTEGER REFERENCES tbl (id), tag TEXT)'. Oder, wenn es einen festen Satz von Tags gibt, fügen Sie diese in eine Tabelle ein und verweisen Sie auf tbl_tags. Ihr zweiter Ansatz, der fünf "Tag" -Felder verwendet, sollte viel schneller sein als Ihr erster Ansatz. Wenn SQLite ein passendes Tag findet, wird es nicht weiter ausgewertet. Sind Sie sicher, dass Ihre Anwendung nicht mehr als 5 Tags enthält? – Jeremy
Wenn Sie eine Tabelle für Ihre Tags erstellen, können Sie diese verbinden: 'SELECT count (id) FROM tbl INNER JOIN tbl_tags ON tags.tbl_id = tbl.id UND (tags.tag = 'home' OR ...)' – Jeremy