Welche Spalten-Index auf, um diese Abfrage schneller zu machen?
-
28-09-2019 - |
Frage
SELECT t.compname, min(t2.version) FROM archdetails t
INNER JOIN svn3 b ON t.compname = b.compname
INNER JOIN archdetails t2 ON t.compname = t2.compname
WHERE ((b.revno = '270294' OR b.revno = 'r275869' OR b.revno = 'r393316'))
AND t.version = '1.6'
GROUP BY t.compname`
Tabelle archdetails
:
Field | Type | Null | Key | Default | Extra
-------------------------+--------------+------+-----+---------+-------
name | varchar(15) | NO | | NULL |
compname | varchar(500) | NO | MUL | NULL |
sno | int(11) | NO | | NULL |
count | int(11) | NO | | NULL |
fdindex | int(11) | NO | | NULL |
version | varchar(10) | NO | | NULL |
sdate | date | NO | | NULL |
edate | date | NO | | NULL |
inFlat | int(11) | NO | | NULL |
inStar | int(11) | NO | | NULL |
inNostar | int(11) | NO | | NULL |
inReducedStar | int(11) | NO | | NULL |
Tabelle svn3
:
Field | Type | Null | Key | Default | Extra
---------+---------------+------+-----+---------+------
name | varchar(20) | NO | MUL | NULL |
revno | varchar(10) | NO | MUL | NULL |
comp | varchar(1000) | NO | MUL | NULL |
compname | varchar(1000) | NO | | NA |
Ich habe 1
Index auf compname version
in archdetails
und 4
Indizes auf svn3
auf revno
; revno, comp, compname
; comp, compname
; und name, revno, comp, compname
.
Die Indizes für compname ist mit einer Länge von 100.
Die Abfrage dauert noch 0.16 sec
auszuführen, die für meine Zwecke sehr teuer ist. Ich habe nicht viel Erfahrung mit Indizes und den oben genannten Indizes haben mit Variablen am häufigsten verwendet, erstellt. Bitte raten, wie man über Indizes gehen.
Lösung
Eine schnelle Antwort. Felder einschließen, die in der where-Klausel
In Ihrem Fall sollten Sie die Indizierung svn3.revno und archdetails.version. Dann schauen Sie sich die Spalten in Ihrem verbinden. Index archdetails.compname ist eine gute Wahl, auch.
Natürlich wollen Sie nicht zu viele Indizes hinzuzufügen. Sie machen Ihre Einfügungen und Löschungen langsamer, und machen Sie Ihre DB mehr Platz in Anspruch nehmen.
Andere Tipps
Versuchen Sie diese
SELECT DISTINCT
t.compname,
t.version
FROM archdetails t
INNER JOIN svn3 b
ON t.compname
= b.compname
WHERE b.revno in ('270294','r275869','r393316')
AND t.version = '1.6'