MySQL, qui est plus efficace longtext, text ou blob? Amélioration de l'insertion de l'efficacité
Je suis dans le processus de migration d'une grande quantité de données à partir de plusieurs bases de données en un seul. Une étape intermédiaire je copie les données dans un fichier pour chaque type de données et la base de données source, puis de le copier sur une grande table dans ma base de données.
La structure est simple dans la nouvelle table, appelée migrate_data. Il se compose d'un id (clé primaire), un type_id (incrémentée dans le type de données défini), de données (un champ contenant un sérialisé objet PHP contenant les données, je suis en migration), source_db (se réfère à la base de données source, évidemment), data_type (identifie le type de données que nous recherchons).
J'ai créé des touches et combinaisons de touches pour tout, mais le champ de données. Actuellement, j'ai le champ de données défini comme un longtext colonne. L'utilisateur insère prennent environ 4,8 secondes en moyenne. J'ai été en mesure de couper jusqu'à 4,3 secondes à l'aide de DELAY_KEY_WRITE=1 sur la table.
Ce que je veux savoir au sujet est de savoir si ou non il est un moyen d'améliorer encore davantage les performances. Éventuellement en changeant de données différent type de colonne. C'est pourquoi je demande à propos de la longtext vs texte vs blob. Sont un de ces plus efficace pour ce genre d'insérer?
Avant de vous répondre, permettez-moi de vous donner un peu plus d'informations. J'ai envoyer toutes les données à insérer une fonction qui prend l'objet, l'exécute par le biais de sérialiser, puis exécute les données à insérer. Il est également fait à l'aide de Drupal 6 (et ses db_query fonction).
Toutes les améliorations de l'efficacité serait génial.
Structure actuelle de la table:
CREATE TABLE IF NOT EXISTS `migrate_data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type_id` int(10) unsigned NOT NULL DEFAULT '0',
`data` longtext NOT NULL,
`source_db` varchar(128) NOT NULL DEFAULT '',
`data_type` varchar(128) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `migrated_data_source` (`source_db`),
KEY `migrated_data_type_id` (`type_id`),
KEY `migrated_data_data_type` (`data_type`),
KEY `migrated_data_id__source` (`id`,`source_db`),
KEY `migrated_data_type_id__source` (`type_id`,`source_db`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 DELAY_KEY_WRITE=1;
OriginalL'auteur Patrick | 2011-07-19
Vous devez vous connecter pour publier un commentaire.
Les différents texte/blob types sont tous identiques dans les besoins de stockage en PHP, et fonctionnent exactement de la même manière, à l'exception des champs de texte sont l'objet du jeu de caractères de conversion. les champs de type blob ne le sont pas. En d'autres termes, les blobs sont pour quand vous êtes le stockage binaire qui DOIT être exactement le même comme il est entré. Les champs de texte sont pour stocker des données de texte qui peut/peut/va être convertie à partir d'un jeu de caractères à un autre.
Pas vraiment, sauf si vous vous coupez de retour sur la quantité de données que vous écrivez. Le stockage de données externe et ne sauvegardant que les chemins d'accès aux fichiers/métadonnées dans la base de données serait plus efficace.
Vraiment??? Je figure que de les stocker dans des fichiers serait plus cher. Surtout depuis que j'ai migrer les données par lots et j'ai pour manipuler les données, que je suis l'importation avant de l'insérer dans Drupal. Le problème que je vois c'est que le système est à court de mémoire, parfois, et si cela n'arrive pas, puis un hasard Drupal fonction du temps. Jusqu'à présent, aucun de mes fonctions ont expiré. Mais en utilisant la base de données je me figure que je suis en éliminant certains de l'utilisation des ressources en les mettant dans la DB.
pensez-y: pour mettre le fichier dans la db, c'est de lire le disque, contraint de MySQL sur le fil de format, envoyés sur le réseau (même si c'est un socket local), décodé, puis écrits sur un disque encore une fois à l'intérieur de mysql innodb/tous les fichiers. Cela, plutôt que de simplement déplacer le fichier quelque part sur le disque et l'insertion d'un certain nombre de métadonnées.
Hmm, ok. Eh bien le seul avantage acquis à l'aide de la structure db pour le stockage intermédiaire serait les capacités de recherche et le fait que le serveur MySQL processus serait distincte de celle de l'Apache/PHP processus. Donnant ainsi plus d'espace pour respirer à l'intérieur de la permis à des ressources pour l'un de ces processus. Si votre fondamentalement le déchargement des responsabilités au serveur MySQL processus.
OriginalL'auteur Marc B