web-dev-qa-db-fra.com

Que signifie "index" sur les RDBMS?

J'utilise des index comme la plupart des développeurs do (surtout sur ... Eh bien! Index), mais je suis sûr qu'il y a beaucoup de moyens subtils d'optimiser une base de données à l'aide de l'index. Je ne sais pas si cela est spécifique à toute mise en œuvre d'un SGBD.

Ma question est la suivante: Quels sont les bons exemples d'utiliser l'indice (à l'exception des cas de base, évidents), et comment un SGBD optimise sa base de données lorsque vous spécifiez un index sur une table?

21
Thomas Joulin

Pensez à un indice comme "Table des matières" ... qui est une liste ordonnée des pointeurs à poser des postes dans un fichier, aka compensations. Dites que vous avez des millions d'enregistrements stockés dans une table, plutôt que de rechercher le tableau des critères de correspondance, il est beaucoup plus rapide de faire référence à une liste ordonnée pour les matchs, puis empiler les pointeurs sur les lignes correspondantes spécifiques. Un exemple parfait d'un index est un champ de clé principale de tableaux, le plus typiquement son champ "ID". Si vous voulez une carte d'identité de ligne # 11234566, il est beaucoup plus rapide de demander à l'index d'un pointeur aux données que de numériser la source de données pour la position 11234566.

Voici une utilisation si évidente de l'indexation:

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

Votre opération peut créer votre enregistrement de journal, mais créer une référence à une date d'heure indexée plus rapide à la recherche/tri que votre table de journaux. Puis rejoignez votre table de journaux sur sa propre clé primaire. Si vous avez besoin de moi pour développer cela, faites le moi savoir. J'espère que cela a du sens.

Exemple de requête:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';
11
randomx

Un point que beaucoup de gens semblent manquer, c'est qu'un SGBD souvent (ou ne peut que) n'utilisera qu'un indice par référence de table dans une requête, et s'il le peut et utilise plusieurs index, il serait probablement plus rapide d'utiliser une combinaison Index si présent.

Par exemple, si vous recherchez une grande table pour les lignes WHERE AnIntegerColumn = 42 AND AnOtherInt = 69 L'itinéraire le plus rapide vers ces lignes serait un index sur les deux colonnes anintegercolumn et un autreint. Si vous n'avez qu'un index sur chacun individuellement mais pas d'index combiné, le DB ne recherchera l'un ou l'autre index et filtrera séparément les résultats avec la deuxième clause, ou analysez les deux et épousez les résultats ultérieurement.

Une autre opération simple simple qui peut être améliorée avec des index composites est WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn - S'il y a un index sur la somécolonne et l'autre collaboration (dans le bon ordre), les opérations de filtrage et de commande peuvent être effectuées simultanément dans certaines circonstances.

L'ajout de trop d'index peut être une mauvaise optimisation de bien sûr, comme l'espace supplémentaire utilisé pour stocker les index (et l'IO-Loard pour les maintenir si votre DB voit de nombreuses opérations d'écriture) peut être un problème pire que les requêtes de lecture légèrement moins optimales , alors ne le faites pas trop.

9
David Spillett

David et Randy ont ceci couvert. Je voulais juste ajouter cela la commande EXPLAIN peut être une aide énorme pour déterminer lorsque vous obtiendrez une grande économie de créer un index, ainsi que de suggérer quels index sont nécessaires . Il affichera les étapes prises par la base de données pour exécuter votre requête afin que vous sachiez quels bits prennent le temps le plus long.

2
Gaurav

Quelque chose que je n'ai pas vu mentionné ici est que lorsque vous avez plus d'un disque, vous voulez probablement mettre votre index sur un autre disque que lorsque les données sont en réalité. Cela peut accélérer certaines opérations. Je pense que cela mérite une question de sa propre raison.

1
jcolebrand