J'ai des données géospatiales, noms avec des coordonnées, dans une table SQLite et créé un arbre pour l'emplacement et un index normal sur la colonne nom.Requête SQLite utilisant rtree et index normal lent
RTree est utilisé selon cette docs: http://www.sqlite.org/rtree.html
Lorsque je fais une recherche des enregistrements dans une zone spécifique, le rtree est utilisé et cela fonctionne rapidement:
SELECT demo_data.* FROM demo_data, demo_index
WHERE demo_data.id=demo_index.id
AND minX>=-81.0 AND maxX<=-79.6
AND minY>=35.0 AND maxY>=36.2;
Quand je QUERY pour les noms, il va aussi vite, parce que le nom-index est utilisé:
SELECT demo_data.* FROM demo_data
WHERE objname="Test"
Mais quand je combine les deux, son semble très lent, comme toute la table est analysé:
SELECT demo_data.* FROM demo_data, demo_index
WHERE demo_data.id=demo_index.id
AND objname="Test"
AND minX>=-81.0 AND maxX<=-79.6
AND minY>=35.0 AND maxY>=36.2;
Pourquoi cette requête combinée utilisant deux index est-elle si lente?
Mise à jour:
Après une enquête plus approfondie avec EXPLIQUER QUERY PLAN, il est apparu que les index sont effectivement utilisés par chaque condition individuelle. Mais le temps d'exécution de la requête combinée dépend du nombre d'enregistrements dans la première condition. Cette table demo_data a 10mio enregistrements. mais la combinaison n'est lente que si la première condition renvoie beaucoup d'enregistrements. Dans ce cas, il y a environ 1000 enregistrements avec objname = "Test" et la requête combinée prend 4 secondes. Une requête combinée pour objname = "Test12345", qui n'existe qu'une seule fois, est très rapide, seulement 10ms
remerciements pour mentionner EXPLAIN QUERY PLAN. Cela a montré que les index étaient réellement utilisés. La raison de l'exécution lente est la quantité de données. J'ai mis à jour ma question – Tom