Ich habe eine Datenbank mit 3 Tabellen, MasterInfo, PrimDescT, SecDescT.Anfrage Optimierung für innere Joins in sqlite
CREATE TABLE masterInfo (id INTEGER PRIMARY KEY AUTOINCREMENT,
primDescId INTEGER,
secDescId INTEGER,
category INTEGER,
UNIQUE(primDescId, secDescId, category));
CREATE TABLE primDescT (id INTEGER PRIMARY KEY,
primDesc nvarchar(512));
CREATE TABLE secDescT (id INTEGER PRIMARY KEY,
secDesc nvarchar(512));
INSERT INTO primDescT VALUES(1,'XXXX');
INSERT INTO primDescT VALUES(2,'YYYY');
INSERT INTO primDescT VALUES(3,'ZZZZ');
INSERT INTO primDescT VALUES(4,'SSSS');
INSERT INTO secDescT VALUES(1,'AAA');
INSERT INTO secDescT VALUES(2,'BBB');
INSERT INTO secDescT VALUES(3,'CCC');
INSERT INTO masterInfo VALUES(1,1,1,1);
INSERT INTO masterInfo VALUES(2,2,2,2);
INSERT INTO masterInfo VALUES(3,3,1,1);
INSERT INTO masterInfo VALUES(4,4,3,2);
Tabellen hat masterInfo 1.765.137 Zeilen, 312210 Zeilen in primDescT, 105458 Zeilen in secDescT.
Ich habe die folgende Abfrage verwendet, um die Ergebnisse abzurufen.
SELECT m.id AS pId,
primDesc AS pDescr, secDesc AS sDescr, category AS category
FROM masterInfo m
INNER JOIN primDescT ON primDescT.id = m.primDescId
INNER JOIN secDescT ON secDescT.id = m.secDescId
WHERE m.category IN ('1','2') ORDER BY pDescr ASC LIMIT 100 OFFSET 0
Die obige Abfrage dauert 8 Sekunden bis zur Antwort.
Aber wenn ich den Offset als 1756300 setze, dann dauert es 53 Sekunden.
SELECT m.id AS pId,
primDesc AS pDescr, secDesc AS sDescr, category AS category
FROM masterInfo m
INNER JOIN primDescT ON primDescT.id = m.primDescId
INNER JOIN secDescT ON secDescT.id = m.secDescId
WHERE m.category IN ('1','2') ORDER BY pDescr ASC LIMIT 100 OFFSET 1756300
Wie kann ich optimieren die obigen Abfragen innerhalb von 3 Sekunden zu holen?
Ich habe die Seitennummerierung, wo Benutzer die n-te Seite navigieren können. Also, ich denke, die Verwendung von Lastvalue wird nicht sinnvoll sein. – Kamith