Il y a environ 2 millions d'enregistrements dans une table appelée log pour le moment. Les performances de la requête ne sont plus acceptables, mais je ne veux pas diviser la table en différentes partitions à l'étape actuelle. Ainsi, j'essaie d'ajouter des index pour améliorer les performances de la requête.
CREATE TABLE log
(
id Integer clé primaire autoincrémentée,
app_id texte,
__key__id INTEGER,
secret texte,
trace_code texte,
url texte,
action texte,
facebook_id texte,
ip texte,
tw_time horodatage,
time horodatage,
tag texte,
to_url texte,
from_url texte,
referer texte,
poids entier,
Unique(app_id, __key__id)
);
CREATE INDEX key1 sur log (action, url, tag);
Cependant, il semble que SQLite ignore simplement mon index et scanne toute la table. Est-ce que j'ai manqué quelque chose ?
sqlite> expliquer plan de requête sélectionner count(*) from log where action like 'content_%
';
0|0|0|SCAN TABLE log (~1182357 rows)
sqlite> expliquer plan de requête sélectionner count(*) from log where action like 'content_%' group by url, tag;
0|0|0|SCAN TABLE log (~1182357 rows)
0|0|0|UTILISER L'INDEX B-TREE TEMPORAIRE POUR LE GROUP BY
EDIT1
@MaxSem Merci, j'ai essayé et j'ai constaté une nette amélioration lorsque j'ai modifié la requête en :
sqlite> expliquer plan de requête sélectionner count(*) from log indexé par key1 where action in ('content_click','content_mouseover', 'content_display');
0|0|0|RECHERCHER TABLE log EN UTILISANT L'INDEX COUVRANT key1 (action=?) (~886770 rows)
0|0|0|EXECUTER SOUS-REQUÊTE DE LISTE 1
Cependant, je ne peux pas expliquer pourquoi SQLite ne peut pas gérer la requête d'origine.
EDIT2
Je devrais changer ma question. Y a-t-il un moyen d'accélérer ce type de requête dans SQLite ?