このクエリをより速くするためにインデックスを作成する列は何ですか?
-
28-09-2019 - |
質問
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`
テーブル 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 |
テーブル 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 |
私は持っています 1
インデックスオン compname version
の archdetails
と 4
インデックスオン svn3
の上 revno
; revno, comp, compname
; comp, compname
;と name, revno, comp, compname
.
Compnameのインデックスは長さ100です。
クエリにはまだかかります 0.16 sec
私の目的のために非常に高価な実行を実行します。インデックスの経験はあまりありません。上記のインデックスは、最も頻繁に使用される変数で作成されています。インデックスをどのように進めるかをアドバイスしてください。
解決
簡単な答え:句にあるフィールドを含めます。
あなたの場合、svn3.revnoとArchdetails.versionのインデックス作成を検討してください。次に、参加の列を見てください。 Index archdetails.compnameも考慮すべきものです。
もちろん、あまりにも多くのインデックスを追加したくありません。彼らはあなたの挿入物と削除を遅くし、あなたのDBをより多くのスペースにします。
他のヒント
これを試して
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'
所属していません StackOverflow