2013-07-31 2 views
0

J'ai une requête. Cela prend 1100 ms, ce que je ne pense pas devoir faire.index sqlite sur les colonnes de chaînes

select * from PageInfo where url = @url OR url like @url2 

L'URL sont /sub/id et /sub2/id/thing. J'ai un index sur pageinfo(url). Le corps de la page est environ ~ 10k et cet échantillon m'a eu 1120ms pour 2 rangs (< 20k). Il se sent mal, cela prend autant de temps. Je devrais être en mesure d'obtenir ces deux pages sur le réseau en moins de temps.

Que puis-je faire pour accélérer les choses? J'ai un index, je ne suis pas sûr de ce que je peux faire d'autre.

+0

Faites juste un ['VACUUM'] (http://www.sqlite.org/lang_vacuum.html) et voyez si vous obtenez une amélioration des performances. – Habib

+0

@Habib: Cela prend du temps et le journal ne fait que 2kb ... La taille du fichier est la même mais ça ne fait que quelques minutes –

+0

VACUUM prend généralement du temps, je ne sais pas pourquoi ça prend autant de temps sur un fichier 2kb. – Habib

Répondre

4

L'utilisation de like empêche l'utilisation de l'index.

Comparer

sqlite> explain query plan select * from PageInfo where url = @url OR url like @url2; 
0|0|0|SCAN TABLE PageInfo (~500000 rows) 
sqlite> 

à

sqlite> explain query plan select * from PageInfo where url = @url OR url between @url2 and @url3; 
0|0|0|SEARCH TABLE PageInfo USING INDEX pi (url=?) (~10 rows) 
0|0|0|SEARCH TABLE PageInfo USING INDEX pi (url>? AND url<?) (~31250 rows) 
sqlite> 

Vous devez utiliser between et construire des arguments à la requête pour @url2 et @url3 tels que

/sub2/1234/thing?page=0 

et

/sub2/1234/thing?page=99999999 
+0

merde sainte qui est incroyable! sa prise de 0ms et j'ai vu un 17ms ici et là. –

+0

Il faut 2 minutes pour faire ce qu'il faut pour prendre plus de 30. Merci –

Questions connexes