2010-10-02 8 views
2

J'ai une grande table avec des millions d'enregistrements.MySQL utilise-t-il des index existants pour créer de nouveaux index?

Table `price` 
------------ 
id 
product 
site 
value 

La table est nouvelle et aucun index n'a été créé.

Je puis lancé une demande de nouvelle création d'index avec la requête suivante:

CREATE INDEX ix_price_site_product_value_id ON price (site, product, value, id); 

Cela a pris très longtemps, la dernière fois que je vérifiais RAN pour 5000+ secondes, en raison de la machine.

Je me demande si j'émets une autre création d'index, utilisera-t-elle l'index existant dans le calcul du processus? Si oui, sous quelle forme?

Suivant pour exécuter la requête 1:

CREATE INDEX ix_price_product_value_id ON price (product, value, id); 

Suivant pour exécuter la requête 2:

CREATE INDEX ix_price_value_id ON price (value, id); 

Répondre

4

Si vous utilisez la version MySQL 5.1, et le moteur de stockage InnoDB, vous pouvez utiliser le InnoDB Plugin 1.0, qui prend en charge une nouvelle fonctionnalité appelée Fast Index Creation. Cela permet au moteur de stockage de créer des index sans copier le contenu de la table entière.

Présentation du plugin InnoDB:

partir de la version 5.1, MySQL AB a promu l'idée d'un moteur de stockage « connectable » l'architecture, ce qui permet à plusieurs moteurs de stockage à ajouter à MySQL. Actuellement, cependant, la plupart des utilisateurs n'ont accédé qu'aux moteurs de stockage distribués par MySQL AB et sont liés aux versions binaires (exécutables).

Depuis 2001, MySQL AB distribue le moteur de stockage transactionnel InnoDB avec ses versions (source et binaire). Depuis MySQL version 5.1, il est possible que les utilisateurs échangent une version d'InnoDB et en utilisent une autre.

Source: Introduction to the InnoDB Plugin

Vue d'ensemble Index rapide Création:

Dans les versions de MySQL à 5.0, l'ajout ou suppression d'un index sur une table avec les données existantes peut être très lent si la table a beaucoup de lignes. Les commandes CREATE INDEX et DROP INDEX fonctionnent en créant une nouvelle table vide définie avec l'ensemble d'index demandé. Il copie ensuite les lignes existantes dans la nouvelle table une par une, mettant à jour les index au fur et à mesure. L'insertion d'entrées dans les index de cette manière, où les valeurs de clé ne sont pas triées, nécessite un accès aléatoire aux nœuds d'index et est loin d'être optimale. Une fois toutes les lignes de la table d'origine copiées, l'ancienne table est supprimée et la copie est renommée avec le nom de la table d'origine. Depuis la version 5.1, MySQL permet à un moteur de stockage de créer ou de supprimer des index sans copier le contenu de la table entière. Le standard InnoDB intégré dans la version 5.1 de MySQL, cependant, ne profite pas de cette fonctionnalité. Avec le plugin InnoDB, cependant, les utilisateurs peuvent dans la plupart des cas ajouter et supprimer des index beaucoup plus efficacement qu'avec les versions antérieures.

...

La modification de l'index clusterisé nécessite la copie des données, même avec InnoDB Plugin. Cependant, ajouter ou supprimer un index secondaire avec le plugin InnoDB est beaucoup plus rapide, car il n'implique pas de copier les données.

Source: Overview of Fast Index Creation

+0

Ça a l'air cool. Comment vérifier si InnoDB Plugin est installé sur la machine? – Pentium10

+0

Faites 'SELECT VERSION()' dans votre client MySQL. Est-ce que votre serveur MySQL v5.1 +? –

+0

ma version est: 5.1.33-community-log – Pentium10

5

Je me demande si je Relancez la création d'index, il sera utiliser l'index existant dans le calcul du processus? Si oui, sous quelle forme?

Non, ce ne sera pas le cas. En théorie, un index sur (site, product, value, id) a tout ce qu'il faut pour construire un index sur n'importe quel sous-ensemble de ces champs (y compris les indices sur (product, value, id) et (value, id)). Cependant, la construction d'un index à partir d'un index secondaire n'est pas supportée.

Tout d'abord, MySQL ne prend pas en charge l'analyse rapide de l'index complet (qui analyse un index dans l'ordre physique plutôt que logique), ce qui rend un chemin d'accès d'index plus cher que la table lue. Ce n'est pas un problème pour InnoDB, puisque la table elle-même est toujours groupée. Deuxièmement, les ordres d'enregistrement dans ces index sont complètement différents de sorte que les enregistrements doivent être triés quand même. Cependant, le principal problème avec la vitesse de création d'index dans MySQL est qu'il génère l'ordre sur site (il suffit d'insérer les enregistrements un par un dans un B-Tree) au lieu d'utiliser une source pré-triée. Comme @Daniel l'a mentionné, la création rapide d'index résout ce problème. Il est disponible en tant que plugin pour 5.1 et est préinstallé en 5.5.

+0

Je voudrais certainement en savoir plus sur le choix de tous les trucs moteur, etc, et comment la vitesse de création d'index fonctionne sur différents types de données. Peut-être que cela devrait être un nouveau matériau pour un nouveau post sur votre blog. Que dis-tu? – Pentium10

+0

@ Pentium10: une bonne idée. – Quassnoi