Un index multi-colonne de travail pour une seule colonne sélectionne trop?
J'ai (par exemple) un indice:
CREATE INDEX someIndex ON orders (customer, date);
N'cet indice seulement d'accélérer les requêtes où client et la date sont utilisés ou faut-il accélérer les requêtes pour une seule colonne comme ce trop?
SELECT * FROM orders WHERE customer > 33;
Je suis en utilisant SQLite.
Si la réponse est oui, pourquoi est-il possible de créer plus d'un index par table?
Encore une autre question: Combien de fois plus vite est une combinaison de l'indice par rapport à deux wc index lorsque vous utilisez les deux colonnes dans une requête?
Vous devez vous connecter pour publier un commentaire.
marc_s a la bonne réponse à votre première question. La première clé dans un multi index de la clé peut fonctionner comme un seul index de clé, mais toutes les clés suivantes ne le seront pas.
Quant à la façon beaucoup plus rapide de l'indice composite est dépend de vos données et la façon dont vous structurez votre index et votre requête, mais il est généralement importante. Les indices essentiellement de permettre aux Sqlite pour faire une recherche binaire sur le champs.
À l'aide de l'exemple que vous avez donné, si vous avez exécuté la requête:
Sqlite faudrait d'abord obtenir tous les résultats à l'aide d'une recherche binaire sur l'ensemble de la table où le client > 33. Alors il faudrait faire une recherche binaire sur les résultats de la recherche pour date > 99.
Si vous avez fait la même requête avec deux indices distincts de la clientèle et de la date, Sqlite aurait binaire de recherche de l'ensemble de la table à deux reprises, une première fois pour le client et pour la date.
Alors, comment beaucoup d'une augmentation de la vitesse, vous verrez dépend de la façon dont vous structurez votre indice en ce qui concerne votre requête. Idéalement, le premier champ de votre index et de votre requête doit être celui qui élimine le plus possible de matchs que va donner la plus grande augmentation de la vitesse en réduisant considérablement la quantité de travail que le deuxième recherche a faire.
Pour plus d'informations, voir ceci:
http://www.sqlite.org/optoverview.html
Je suis sûr que cela va fonctionner, oui - il n'en MS SQL Server, de toute façon.
Cependant, cet indice ne vous aidera pas si vous devez choisir la date, par exemple une plage de dates. Dans ce cas, vous pourriez avoir besoin pour créer un deuxième indice sur la date pour rendre ces requêtes plus efficace.
Marc
J'ai souvent l'utilisation combinée des indices de trier les données que je souhaite pour paginer ou de la demande "streamily".
En supposant qu'un client peut faire qu'une seule commande.. et les clients de 0 à 11 existe pas et il y a plusieurs commandes par client tout inséré dans un ordre aléatoire. Je veux une requête basée sur le numéro de client de suivi de la date. Vous devez trier le champ id ainsi la dernière à split fixe où un client a plusieurs des dates identiques (même si cela peut ne jamais se produire).
Page 1 de une requête triée (limité à 10 points):
Obtenez la page suivante:
Et ainsi de suite...
Ayant les indices en place réduit le côté serveur de l'indice de numérisation lorsque vous autrement utiliser une requête DÉCALAGE couplé avec une LIMITE. La durée de la requête est plus longue et les lecteurs de chercher plus dur, plus le décalage va. En utilisant cette méthode élimine que.
À l'aide de cette méthode est recommandée si vous prévoyez sur l'adhésion de données plus tard, mais seulement besoin d'un ensemble limité de données à la demande. Adhérer à l'encontre d'une sous-sélection, comme décrit ci-dessus pour réduire la surcharge de la mémoire pour les grandes tables.