Comment fonctionne l’indexation de la firebase database?

Étant donné que l’indexation est si importante que la taille de votre dataset augmente, est-ce que quelqu’un peut expliquer comment l’indexation fonctionne au niveau de la firebase database?

Pour plus d’informations sur les requêtes permettant d’indexer un champ, consultez Comment indexer une colonne de firebase database .

Pourquoi est-ce nécessaire?

Lorsque des données sont stockées sur des périphériques de stockage sur disque, elles sont stockées sous forme de blocs de données. Ces blocs sont accessibles dans leur intégralité, ce qui en fait l’opération d’access au disque atomique. Les blocs de disque sont structurés de la même manière que les listes liées. les deux contiennent une section pour les données, un pointeur sur l’emplacement du prochain nœud (ou bloc), et les deux n’ont pas besoin d’être stockés de manière contiguë.

Étant donné qu’un certain nombre d’enregistrements ne peuvent être sortingés que sur un seul champ, nous pouvons affirmer que la recherche sur un champ non sortingé nécessite une recherche linéaire nécessitant N/2 access de bloc (en moyenne), où N est le nombre de blocs que la table couvre. Si ce champ est un champ non-clé (c’est-à-dire qu’il ne contient pas d’entrées uniques), il faut rechercher l’intégralité du tablespace dans N blocs d’access.

Alors qu’avec un champ sortingé, une recherche binary peut être utilisée, qui a des access au bloc log2 N De plus, étant donné que les données sont sortingées en fonction d’un champ non-clé, le rest de la table n’a pas besoin d’être recherché pour les valeurs en double, une fois qu’une valeur plus élevée est trouvée. Ainsi, l’augmentation de la performance est substantielle.

Qu’est-ce que l’indexation?

L’indexation est un moyen de sortinger un certain nombre d’enregistrements sur plusieurs champs. La création d’un index sur un champ dans une table crée une autre structure de données qui contient la valeur du champ et un pointeur sur l’enregistrement auquel elle se rapporte. Cette structure d’index est ensuite sortingée, ce qui permet d’effectuer des recherches binarys.

L’inconvénient de l’indexation est que ces index requièrent un espace supplémentaire sur le disque, car les index sont stockés ensemble dans une table à l’aide du moteur MyISAM. Ce fichier peut rapidement atteindre les limites de taille du système de fichiers sous-jacent. .

Comment ça marche?

Tout d’abord, décrivons un exemple de schéma de table de firebase database;

 Nom du champ Type de données Taille sur le disque
 id (clé primaire) Unsigned INT 4 octets
 firstName Char (50) 50 octets
 lastName Char (50) 50 octets
 emailAddress Char (100) 100 octets

Remarque : char a été utilisé à la place de varchar pour permettre une taille précise sur la valeur du disque. Cet exemple de firebase database contient cinq millions de lignes et n’est pas indexé. La performance de plusieurs requêtes va maintenant être analysée. Il s’agit d’une requête utilisant l’ id (un champ clé sortingé) et un utilisant le prénom (un champ non sortingé non-clé).

Exemple 1Champs sortingés et non sortingés

Étant donné notre firebase database exemple de r = 5,000,000 enregistrements de taille fixe donnant une longueur d’enregistrement de R = 204 octets et qu’ils sont stockés dans une table à l’aide du moteur MyISAM qui utilise la taille de bloc par défaut B = 1,024 octets. Le facteur de blocage de la table serait bfr = (B/R) = 1024/204 = 5 enregistrements par bloc de disque. Le nombre total de blocs requirejs pour contenir la table est N = (r/bfr) = 5000000/5 = 1,000,000 blocs.

Une recherche linéaire sur le champ id nécessiterait une moyenne de N/2 = 500,000 access au bloc pour trouver une valeur, étant donné que le champ id est un champ clé. Mais comme le champ id est également sortingé, une recherche binary peut être effectuée, nécessitant une moyenne de log2 1000000 = 19.93 = 20 access par bloc. Instantanément, nous pouvons voir que c’est une amélioration radicale.

Maintenant, le champ firstName n’est ni sortingé ni un champ clé, donc une recherche binary est impossible, et les valeurs ne sont pas uniques, et la table nécessitera donc une recherche à la fin pour un access N = 1,000,000 blocs exact. C’est cette situation que l’indexation vise à corriger.

Étant donné qu’un enregistrement d’index ne contient que le champ indexé et un pointeur sur l’enregistrement d’origine, il est évident qu’il sera plus petit que l’enregistrement multi-champs vers lequel il pointe. Ainsi, l’index lui-même nécessite moins de blocs de disque que la table d’origine, ce qui nécessite donc moins d’access aux blocs. Le schéma d’un index sur le champ firstName est décrit ci-dessous.

 Nom du champ Type de données Taille sur le disque
 firstName Char (50) 50 octets
 (pointeur d'enregistrement) Spécial 4 octets

Remarque : Les pointeurs de MySQL ont une longueur de 2, 3, 4 ou 5 octets en fonction de la taille de la table.

Exemple 2indexation

Étant donné notre firebase database exemple de r = 5,000,000 enregistrements avec une longueur d’enregistrement d’index de R = 54 octets et en utilisant la taille de bloc par défaut B = 1,024 octets. Le facteur de blocage de l’indice serait bfr = (B/R) = 1024/54 = 18 enregistrements par bloc de disque. Le nombre total de blocs requirejs pour contenir l’indice est N = (r/bfr) = 5000000/18 = 277,778 blocs.

Maintenant, une recherche utilisant le champ firstName peut utiliser l’index pour augmenter les performances. Cela permet une recherche binary de l’index avec une moyenne de log2 277778 = 18.08 = 19 access au bloc. Pour trouver l’adresse de l’enregistrement réel, qui nécessite un access supplémentaire au bloc pour lire, ce qui porte le total à 19 + 1 = 20 access de bloc, loin des 1 000 000 d’access de bloc requirejs pour trouver une correspondance firstName dans la table non indexée .

Quand devrait-il être utilisé?

Etant donné que la création d’un index nécessite un espace disque supplémentaire (277 778 blocs supplémentaires par rapport à l’exemple ci-dessus, soit une augmentation d’environ 28%) et qu’un trop grand nombre d’index peut entraîner des problèmes liés à la taille des systèmes de fichiers, champs à indexer.

Étant donné que les index ne sont utilisés que pour accélérer la recherche d’un champ correspondant dans les enregistrements, il va de soi que les champs d’indexation utilisés uniquement pour la sortie seraient simplement une perte d’espace disque et de temps de traitement lors d’une opération d’insertion ou de suppression. devrait être évité. Compte tenu également de la nature d’une recherche binary, la cardinalité ou l’unicité des données est importante. L’indexation sur un champ avec une cardinalité de 2 diviserait les données en deux tandis qu’une cardinalité de 1 000 renverrait environ 1 000 enregistrements. Avec une telle cardinalité, l’efficacité est réduite à un sorting linéaire et l’optimiseur de requêtes évitera d’utiliser l’index si la cardinalité est inférieure à 30% du nombre d’enregistrements, faisant de l’index une perte d’espace.

La première fois que j’ai lu cela, cela m’a été très utile. Je vous remercie.

Depuis lors, j’ai eu un aperçu de l’inconvénient de la création d’index: si vous écrivez dans une table ( UPDATE ou INSERT ) avec un index, vous avez en fait deux opérations d’écriture dans le système de fichiers. Une pour les données de table et une autre pour les données d’index (et leur utilisation (et – si elles sont regroupées – le recours aux données de la table)). Si la table et l’index sont situés sur le même disque dur, cela coûte plus de temps. Ainsi, une table sans index (un tas) permettrait des opérations d’écriture plus rapides. (Si vous aviez deux index, vous vous retrouveriez avec trois opérations d’écriture, etc.)

Cependant, la définition de deux emplacements différents sur deux disques durs différents pour les données d’index et les données de table peut réduire ou éliminer le problème de la hausse du coût du temps. Cela nécessite la définition de groupes de fichiers supplémentaires avec les fichiers correspondants sur les disques durs souhaités et la définition de l’emplacement table / index souhaité.

Un autre problème avec les index est leur fragmentation au fil du temps à mesure que les données sont insérées. REORGANIZE aide, vous devez écrire des routines pour le faire.

Dans certains scénarios, un tas est plus utile qu’une table avec des index,

Par exemple: – Si vous avez beaucoup d’écritures rivales, mais une seule fois en dehors des heures de travail pour les rapports.

En outre, une différenciation entre les index clusterisés et non indexés est plutôt importante.

M’a aidé: – Que signifie réellement l’index clusterisé et non clusterisé?

Un index est simplement une structure de données qui accélère la recherche d’une colonne spécifique dans une firebase database. Cette structure est généralement une arborescence ou une table de hachage, mais il peut s’agir de toute autre structure logique.

Pour plus d’informations, je recommande: Comment fonctionnent les index de firebase database? Et comment les index aident-ils?

Maintenant, disons que nous voulons lancer une requête pour trouver tous les détails des employés nommés “Abc”?

 SELECT * FROM Employee WHERE Employee_Name = 'Abc' 

Que se passerait-il sans index?

Le logiciel de firebase database devrait littéralement regarder chaque ligne de la table Employee pour voir si le nom Employee_Name de cette ligne est «Abc». Et, parce que nous voulons que chaque ligne porte le nom ‘Abc’, nous ne pouvons pas arrêter de chercher une fois que nous trouvons une seule ligne avec le nom ‘Abc’, car il pourrait y avoir d’autres lignes avec le nom Abc . Donc, chaque ligne jusqu’à la dernière ligne doit être recherchée – ce qui signifie que des milliers de lignes dans ce scénario devront être examinées par la firebase database pour trouver les lignes avec le nom ‘Abc’. C’est ce qu’on appelle une parsing complète de la table

Comment un index de firebase database peut aider les performances

L’intérêt d’un index est d’accélérer les requêtes de recherche en réduisant essentiellement le nombre d’enregistrements / lignes d’une table à examiner. Un index est une structure de données (le plus souvent une arborescence B) qui stocke les valeurs d’une colonne spécifique dans une table.

Comment fonctionne l’index B-trees?

La raison pour laquelle les B-arbres sont la structure de données la plus populaire pour les index est due au fait qu’ils sont efficaces en termes de temps, car les recherches, les suppressions et les insertions peuvent être effectuées en temps logarithmique. Et, une autre raison majeure pour laquelle les arbres B sont plus couramment utilisés est que les données stockées dans l’arborescence B peuvent être sortingées. Le SGBDR détermine généralement quelle structure de données est réellement utilisée pour un index. Mais, dans certains scénarios avec certains SGBDR, vous pouvez réellement spécifier la structure de données que votre firebase database doit utiliser lorsque vous créez l’index lui-même.

Comment fonctionne un index de table de hachage?

La raison pour laquelle les index de hachage sont utilisés est que les tables de hachage sont extrêmement efficaces pour rechercher des valeurs. Ainsi, les requêtes qui se comparent en termes d’égalité à une chaîne peuvent récupérer des valeurs très rapidement si elles utilisent un index de hachage.

Par exemple, la requête dont nous avons parlé précédemment pourrait bénéficier d’un index de hachage créé dans la colonne Employee_Name. La façon dont un index de hachage fonctionnerait serait que la valeur de la colonne serait la clé dans la table de hachage et que la valeur réelle mappée sur cette clé serait simplement un pointeur vers les données de la ligne dans la table. Comme une table de hachage est fondamentalement un tableau associatif, une entrée typique ressemblerait à “Abc => 0x28939 ″, où 0x28939 est une référence à la ligne de la table où Abc est stocké en mémoire. Rechercher une valeur comme «Abc» dans un index de table de hachage et récupérer une référence à la ligne en mémoire est évidemment beaucoup plus rapide que de scanner la table pour trouver toutes les lignes avec une valeur «Abc» dans la colonne Employee_Name.

Les inconvénients d’un index de hachage

Les tables de hachage ne sont pas des structures de données sortingées, et il existe de nombreux types de requêtes avec lesquelles les index de hachage ne peuvent même pas aider. Par exemple, supposons que vous souhaitiez connaître tous les employés âgés de moins de 40 ans. Comment pourriez-vous faire cela avec un index de table de hachage? Eh bien, ce n’est pas possible car une table de hachage n’est utile que pour rechercher des paires de valeurs clés – ce qui signifie que les requêtes vérifient l’égalité

Que contient exactement un index de firebase database? Ainsi, vous savez maintenant qu’un index de firebase database est créé sur une colonne d’une table et que l’index stocke les valeurs dans cette colonne spécifique. Mais, il est important de comprendre qu’un index de firebase database ne stocke pas les valeurs dans les autres colonnes de la même table. Par exemple, si nous créons un index sur la colonne Employee_Name, cela signifie que les valeurs de colonne Employee_Age et Employee_Address ne sont pas également stockées dans l’index. Si nous stockions simplement toutes les autres colonnes de l’index, cela reviendrait à créer une autre copie de la table entière, ce qui prendrait beaucoup trop de place et serait très inefficace.

Comment une firebase database sait-elle quand utiliser un index? Lorsqu’une requête comme «SELECT * FROM Employee WHERE Employee_Name = ‘Abc’» est exécutée, la firebase database vérifie s’il existe un index sur la ou les colonnes interrogées. En supposant que la colonne Employee_Name a un index créé, la firebase database devra décider si l’utilisation de l’index pour rechercher les valeurs recherchées est réellement utile, car il existe certains scénarios dans lesquels l’utilisation de l’index de firebase database est moins efficace. , et plus efficace juste pour scanner la table entière.

Quel est le coût d’avoir un index de firebase database?

Cela prend de la place – et plus votre table est grande, plus votre index est grand. Un autre problème de performance avec les index est le fait que chaque fois que vous ajoutez, supprimez ou mettez à jour des lignes dans la table correspondante, vous devrez effectuer les mêmes opérations sur votre index. N’oubliez pas qu’un index doit contenir les mêmes données à la minute que celles contenues dans la ou les colonnes de la table couvertes par l’index.

En règle générale, un index ne doit être créé sur une table que si les données de la colonne indexée sont fréquemment interrogées.

Voir également

  1. Quelles colonnes font généralement de bons index?
  2. Comment fonctionnent les index de firebase database

Exemple classique “Index dans les livres”

Considérons un “livre” de 1000 pages, divisé par 100 sections, chaque section comportant des pages X.

Simple, hein?

Maintenant, sans page d’index, pour trouver une section particulière commençant par la lettre “S”, vous n’avez pas d’autre choix que de parcourir tout le livre. ie: 1000 pages

Mais avec une page d’index au début, vous êtes là. Et plus encore, pour lire n’importe quelle section particulière, il vous suffit de parcourir la page d’index, encore et encore, à chaque fois. Après avoir trouvé l’index correspondant, vous pouvez accéder directement à la section en ignorant les autres sections.

Mais, en plus des 1000 pages, vous aurez besoin d’environ 10 pages supplémentaires pour afficher la page d’index, soit 1010 pages au total.

Ainsi, l’index est une section distincte qui stocke les valeurs de la colonne indexée + du pointeur sur la ligne indexée dans un ordre sortingé pour des recherches efficaces.

Les choses sont simples dans les écoles, n’est-ce pas? : P

Description simple !!!!!!!!!!

L’index n’est rien d’autre qu’une structure de données qui stocke les valeurs d’une colonne spécifique dans une table. Un index est créé sur une colonne d’une table.

Par exemple, nous avons une table de firebase database appelée User avec trois colonnes – Name, Age et Address. Supposons que la table utilisateur comporte des milliers de lignes.

Maintenant, supposons que nous voulions lancer une requête pour trouver tous les détails des utilisateurs nommés “John”. Si nous exécutons la requête suivante.

 SELECT * FROM User WHERE Name = 'John' 

Le logiciel de firebase database devrait littéralement regarder chaque ligne de la table User pour voir si le nom de cette ligne est «John». Cela prendra beaucoup de temps.
C’est là que l’index nous aide “index est utilisé pour accélérer les requêtes de recherche en réduisant essentiellement le nombre d’enregistrements / lignes dans une table qui doit être examinée”.
Comment créer un index

 CREATE INDEX name_index ON User (Name) 

Un index se compose de valeurs de colonne (Eg: John) d’une table et que ces valeurs sont stockées dans une structure de données.
Alors maintenant, la firebase database utilisera l’index pour trouver les employés nommés John parce que l’index sera probablement sortingé alphabétiquement par le nom de l’utilisateur. Et comme il est sortingé, cela signifie que la recherche d’un nom est beaucoup plus rapide car tous les noms commençant par un «J» seront côte à côte dans l’index!

Juste une petite suggestion .. Comme l’indexation vous coûte des écritures supplémentaires et de l’espace de stockage, si votre application nécessite plus d’opérations d’insertion / mise à jour, vous pouvez utiliser des tables sans index, mais si cela nécessite plus d’opérations de récupération de données table.

Pensez simplement à Index de firebase database comme index d’un livre. Si vous avez un livre sur les chiens et que vous voulez trouver une information sur, disons, les bergers allemands, vous pouvez bien sûr parcourir toutes les pages du livre et trouver ce que vous cherchez, mais cela prend du temps et pas très vite. Une autre option est que, vous pouvez simplement aller à la section Index du livre et ensuite trouver ce que vous cherchez en utilisant le nom de l’entité que vous recherchez (dans cet exemple, les bergers allemands) et en regardant le numéro de page à trouvez rapidement ce que vous cherchez. Dans Database, le numéro de page est appelé un pointeur qui dirige la firebase database vers l’adresse sur le disque où l’entité est située. En utilisant la même analogie avec German Shepherd, nous pourrions avoir quelque chose comme «German Shepherd», 0x77129) où 0x77129 est l’adresse sur le disque où sont stockées les données de ligne pour German Shepherd.

En résumé, un index est une structure de données qui stocke les valeurs d’une colonne spécifique dans une table afin d’accélérer la recherche de requêtes.

L’index SQL est un élément lié à l’accélération de la recherche dans la firebase database SQL. Index permet au programmeur de récupérer les données de la firebase database très rapidement. Supposons que vous soyez un étudiant ou un lecteur de livre. Votre livre contient 50 000 pages. Le premier jour, vous lisez le sujet “ABC” le lendemain, vous voulez lire un autre sujet “xyz”. vous ne passerez jamais manuellement par page. Ce que vous allez faire dans cette situation est d’utiliser Index du livre pour rechercher un sujet spécifique puis passer directement à votre sujet. Index a sauvé beaucoup de temps pour rechercher un sujet. Identique à l’index SQL, Index permet de rechercher très rapidement des millions d’enregistrements depuis une firebase database.

Un index de firebase database est une structure de données qui améliore la vitesse des opérations de récupération de données sur une table de firebase database, au prix d’écritures supplémentaires et d’un espace de stockage pour gérer la structure des données d’index. Les index permettent de localiser rapidement les données sans avoir à rechercher chaque ligne d’une table de firebase database à chaque fois qu’une table de firebase database est accessible. Les index peuvent être créés en utilisant une ou plusieurs colonnes d’une table de firebase database, fournissant la base pour des recherches aléatoires rapides et un access efficace aux enregistrements ordonnés.