(Sahte) isimleri içeren, her biri 50.000 satır ile iki tablo ile bir sqlite veritabanı var. Her iki tablo için ortak olan kaç ad (verilen ad, orta ad, soyadı) olduğunu bulmak için basit bir sorgu oluşturdum:
select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;
Birincil anahtarlar (bu sorgu ile alakasız) dışında hiçbir dizin yoksa, hızlı bir şekilde çalışır:
[james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 0m0.115s
user 0m0.111s
sys 0m0.004s
Ancak, her bir tablodaki üç sütuna dizinler eklersem (toplamda altı dizin):
CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` )
//etc.
sonra acı verici yavaş çalışır:
[james@marlon Downloads] $ time sqlite3 generic_data.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 1m43.102s
user 0m52.397s
sys 0m50.696s
Bunun herhangi bir kafiye veya nedeni var mı?
Dizinsiz EXPLAIN QUERY PLAN
sürümün sonucu :
0|0|0|SCAN TABLE fakenames_uk
0|1|1|SEARCH TABLE fakenames_usa USING AUTOMATIC COVERING INDEX (middleinitial=? AND surname=? AND givenname=?)
Bu dizinlerle:
0|0|0|SCAN TABLE fakenames_uk
0|1|1|SEARCH TABLE fakenames_usa USING INDEX idx_us_middleinitial (middleinitial=?)
SELECT c FROM t WHERE a=1 AND b=2
için dizin t(a,b,c)
örtüyor ancak kapsamıyor t(a,b)
. Kapsama endekslerinin yararı, tüm sorgu sonucunun doğrudan endeksten çekilebilmesidir, buna karşılık kapamayan endeksler hızlı bir şekilde ilgili satırları bulur, ancak yine de değerleri seçmek için ana tablo verilerine başvurması gerekir.
middleinitial
,surname
vegivenname
)?