I index utilisent couramment combinés pour trier par données que je souhaite pagine ou demande « streamily ».
En supposant qu'un client peut effectuer plus d'une commande .. et qu'il existe des clients de 0 à 11 et qu'il y a plusieurs commandes par client toutes insérées dans un ordre aléatoire. Je veux trier une requête en fonction du numéro de client suivi de la date. Vous devez également trier le champ id pour diviser les ensembles où un client a plusieurs dates identiques (même si cela peut ne jamais arriver).
sqlite> CREATE INDEX customer_asc_date_asc_index_asc ON orders
(customer ASC, date ASC, id ASC);
Get page 1 d'une requête triée (limité à 10 articles):
sqlite> SELECT id, customer, date FROM orders
ORDER BY customer ASC, date ASC, id ASC LIMIT 10;
2653|1|1303828585
2520|1|1303828713
2583|1|1303829785
1828|1|1303830446
1756|1|1303830540
1761|1|1303831506
2442|1|1303831705
2523|1|1303833761
2160|1|1303835195
2645|1|1303837524
Obtenez la page suivante:
sqlite> SELECT id, customer, date FROM orders WHERE
(customer = 1 AND date = 1303837524 and id > 2645) OR
(customer = 1 AND date > 1303837524) OR
(customer > 1)
ORDER BY customer ASC, date ASC, id ASC LIMIT 10;
2515|1|1303837914
2370|1|1303839573
1898|1|1303840317
1546|1|1303842312
1889|1|1303843243
2439|1|1303843699
2167|1|1303849376
1544|1|1303850494
2247|1|1303850869
2108|1|1303853285
Et ainsi de suite ...
Avoir les index en place réduit l'analyse de l'index côté serveur lorsque vous utiliseriez une requête OFFSET couplée à une LIMIT. Le temps d'interrogation devient plus long et les disques recherchent plus le décalage est élevé. L'utilisation de cette méthode élimine cela.
L'utilisation de cette méthode est conseillée si vous envisagez de joindre des données ultérieurement, mais que vous avez seulement besoin d'un ensemble limité de données par requête. Joignez-vous à un SUBSELECT comme décrit ci-dessus pour réduire la charge de mémoire pour les grandes tables.
SQLite n'utilisera PAS la deuxième colonne d'un index si la première colonne était une expression d'inégalité (par exemple client> 33). (La plupart des moteurs de base de données seraient durs). – vmatyi
Si vous créez deux index distincts, un seul d'entre eux sera utilisé, l'autre sera évaluée sur l'ensemble de résultats généré par le premier. (sur un Oracle, il peut exécuter les deux recherches d'index et croiser les ensembles de résultats, si l'optimisation est basée sur les coûts et si certains critères sont réunis, mais c'est un cas rare). – vmatyi