J'ai un tableau avec 1,4 milliard d'enregistrements. La structure du tableau est la suivante:
CREATE TABLE text_page (
text VARCHAR(255),
page_id INT UNSIGNED
) ENGINE=MYISAM DEFAULT CHARSET=ascii
La condition est de créer un index sur la colonne text
.
La taille de la table est d'environ 34G.
J'ai essayé de créer l'index par la déclaration suivante:
ALTER TABLE text_page ADD KEY ix_text (text)
Après 10 heures d'attente, j'ai finalement abandonné cette approche.
Existe-t-il une solution viable à ce problème?
MISE À JOUR : il est peu probable que le tableau soit mis à jour, inséré ou supprimé. La raison pour laquelle créer un index sur la colonne text
est que ce type de requête sql serait fréquemment exécuté:
SELECT page_id FROM text_page WHERE text = ?
MISE À JOUR : J'ai résolu le problème en partitionnant la table.
La table est divisée en 40 pièces sur colonne text
. La création d'index sur la table prend ensuite environ 1 heure.
Il semble que la création d'index MySQL devienne très lente lorsque la taille de la table devient très grande. Et le partitionnement réduit la table en troncs plus petits.
CREATE INDEX
déclaration normale ?Réponses:
Serait-ce que votre système n'est tout simplement pas à la hauteur? Je n'utilise pas MySQL (ici SQL Server), mais je connais la peine d'indexer une table d'entrées de 800 millions. Fondamentalement ... vous avez besoin du bon matériel pour cela (comme dans: beaucoup de disques rapides). J'utilise maintenant près d'une douzaine de Velociraptors et les performances sont excellentes;)
Les serveurs SQL (pas en tant que MS SQL Server, mais en tant que serveurs de base de données utilisant SQL) vivent et meurent avec un accès au disque, et les disques normaux ne sont tout simplement pas à la hauteur d'opérations plus importantes.
la source
Vous souhaiterez peut-être créer un index sur les premiers (par exemple, 10) caractères du champ de texte.
Depuis les documents:
Des index peuvent être créés qui n'utilisent que la partie principale des valeurs de colonne, en utilisant la syntaxe col_name (longueur) pour spécifier une longueur de préfixe d'index:
la source
J'ai résolu le problème en partitionnant la table.
La table est divisée en 40 pièces sur colonne
text
. La création d'index sur la table prend ensuite environ 1 heure.Il semble que la création d'index MySQL devienne très lente lorsque la taille de la table devient très grande. Et le partitionnement réduit la table en troncs plus petits.
la source
Réglez sort_buffer_size sur 4 Go (ou autant que vous le pouvez en fonction de la quantité de mémoire dont vous disposez).
À l'heure actuelle, l'index de création effectue un tri, mais comme vous disposez d'une taille de sort_buffer_size de 32 Mo, il écrase inutilement le disque dur.
la source
Si vous n'avez pas besoin de faire des requêtes comme:
Je suggère de créer une nouvelle colonne de hachage et d'indexer la table par la colonne. La taille globale de la table + index peut être beaucoup plus petite.
UPD : Au fait, 1,4 milliard d'entiers de clé primaire occupent environ 6 Go, c'est-à-dire que la longueur moyenne de la chaîne est inférieure à 30 caractères, c'est-à-dire que l'indexation sur un préfixe pourrait être plus préférable.
Vous devriez également jeter un œil au moteur de stockage MERGE .
la source
Une façon de procéder consiste à créer une nouvelle table avec l'ensemble d'index et à copier les données dans la nouvelle table.
Assurez-vous également d'avoir suffisamment d'espace temporaire.
la source
Dans le cas où vous vous demandez toujours comment faire le mieux, je vous suggère d'utiliser un outil de table en ligne alter.
Il y en a beaucoup sur Internet, dont les plus connus sont:
http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
Nous avons les mêmes problèmes avec les grandes tables (plus de 500mil de disques) et la modification est parfaite. Il crée une nouvelle table tmp, ajoute un déclencheur sur la table d'origine (pour les nouveaux enregistrements de mise à jour / suppression / insertion) et en attendant, il copie tous les enregistrements dans la nouvelle table (avec la nouvelle structure)
Bonne chance!
la source