Base de données Drupal innodb ou MyISAM?

10

J'ai un site Drupal et je souffre de problèmes de performances. J'ai trouvé Comment convertir une base de données de MyISAM en InnoDB? indiquant que les performances peuvent s'améliorer en changeant.

Comment savoir si ma base de données MySQL est InnoDB ou MyISAM?

chrisjlee
la source
1
Le type de table n'est pas lié au catalogue. Vous pouvez avoir un catalogue contenant un mélange de tables MyISAM et InnoDB.
mpdonadio
2
Bien que les optimisations présentent des avantages à ce niveau, je doute fortement que la modification des types de table résoudra vos problèmes de performances. La différence n'est tout simplement pas si grande.
Letharion
1
@Chris J. Lee, c'est exact. Le mélange des types de table peut être utilisé pour des raisons de performances ou pour exploiter des fonctionnalités uniquement disponibles pour un type de table particulier (par exemple, la recherche FULLTEXT avec les tables MyISAM). Cela peut également se produire par accident si vous modifiez les valeurs par défaut de mysqld et créez plus de tables dans un catalogue :)
mpdonadio
2
Létharion: c'est tout simplement incorrect. Les types de table et la façon dont mysql est configuré pour eux ont un impact énorme sur les performances!
Walter Heck
2
@Letharion: En fait, mis à part les améliorations architecturales, de très gros gains de performances dans le cas de choses comme la concurrence avec des SELECT et UPDATE mixtes - une UPDATE verrouillera une table dans MyISAM, mais seulement une ligne dans InnoDB - signifie que d'énormes augmentations de performances peuvent être vu avec rien de plus que de changer le moteur d'une table. Maintenant, si vous faites une requête idiote, alors vous faites une requête idiote, et changer les types de table n'aidera pas. Mais rejeter d'emblée le changement de moteur est tout aussi incorrect.
BMDan

Réponses:

8

Vous pouvez exécuter une requête personnalisée:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

pour répertorier toutes les tables de votre base de données et le moteur utilisé pour chacune.

Alternativement, vous pouvez vous connecter à votre base de données en utilisant phpMyAdmin et sélectionner votre base de données ... vous verrez le moteur dans la Typecolonne de la liste des tableaux.

Personnellement, je recommanderais Navicat pour MySQL , c'est une très belle interface graphique MySQL et rend la découverte de choses comme celle-ci très facile.

Source: http://www.electrictoolbox.com/mysql-table-storage-engine/

Clive
la source
L'ancien outil Administrateur MySQL fonctionne également bien pour des choses comme celle-ci. Si vous fouillez le site Web MySQL, vous pouvez toujours trouver le programme d'installation.
mpdonadio
@MPD Wow ça continue? Doit télécharger ça même si c'est juste pour un peu de nostalgie :)
Clive
L'administrateur et le navigateur de requêtes sont officiellement obsolètes et non pris en charge maintenant, mais vous pouvez toujours les télécharger. Je déteste Workbench et je les utilise toujours.
mpdonadio
Pour afficher une sortie similaire à ce que vous avez vu dans phpMyAdmin sur la ligne de commande, utilisez SHOW TABLE STATUS. Pour obtenir un compte simple du nombre de tableaux dans chaque type de moteur, c'est le cas SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
6

Ma meilleure expérience a été de décider par table. InnoDB est agréable, car il peut éviter le verrouillage de table (aucun autre processus ne peut lire à partir d'une table pendant qu'un processus écrit), mais il fonctionne très bien avec COUNT () qui est souvent utilisé pour les requêtes de pageur.

(Modifier: veuillez voir le commentaire de Clives ci-dessous)

Il existe également des implications sur votre configuration MySQL, selon la base de données que vous utilisez. Si vous avez accès au serveur, mysqltuner devrait être votre première étape, pour vérifier la configuration:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Martin
la source
2
+1 Je ne savais pas InnoDB était lent pour les COUNTrequêtes, selon cet article par l'ancien directeur du groupe de haute performance pour MySQL si elle n'affecte vraiment une requête contenant COUNT(*) sans une WHEREclause.
Clive
3
La raison en est que MyISAM conserve une valeur par table pour le nombre de lignes dans la table, ce qui signifie qu'un simple SELECT COUNT(*) FROM tablepeut retourner instantanément avec cette valeur. InnoDB ne le fait pas, il doit donc analyser l'intégralité de l'index de clé primaire. Cela dit, bien que Drupal en fasse beaucoup SELECT COUNT(*), je ne peux penser qu'à un seul endroit dans tout le code qui le fasse sans WHEREclause. Par conséquent, n'utilisez pas MyISAM par souci pour ce cas particulier. InnoDB avec un pool de mémoire tampon de taille décente sera plus rapide pour toutes les requêtes du monde réel.
BMDan
6

Essayer simplement des choses pour obtenir un site Web plus rapidement, c'est comme changer aveuglément des voitures et espérons que vous obtiendrez un plus rapide la prochaine fois.

Essayez d'abord les fruits bas, si cela n'aide pas, essayez de trouver le vrai goulot d'étranglement.

  1. Avez-vous activé les mécanismes intégrés: mise en cache des pages (uniquement efficace pour les utilisateurs anonymes), agrégation CSS et JS?
  2. Si votre hôte propose un cache d'opcode comme APC, activez-le.
  3. Configurez votre Drupal localement, y compris la base de données complète.
  4. Assurez-vous que XDebug est en cours d'exécution.
  5. Commencez à réaliser un profilage de performances réel. De cette façon, vous pouvez identifier quelle partie de votre site Web consomme beaucoup de temps. Plus votre site Web est lent, plus il est facile de trouver le code / composant coupable.

Souvent, c'est juste une requête DB lente qui a besoin d'un index, ou d'un module qui fait les choses lentement.

J'ai également découvert de grandes différences entre les hébergeurs. Si vous installez un nouveau drupal hors de la boîte, les performances sont-elles correctes? Sinon, il est temps de chercher un autre hébergeur.

BetaRide
la source
5

FWIW, notre site Drupal 6.x de près de 20 000 nœuds rencontrait des problèmes de performances et j'ai choisi de déplacer toutes les tables vers InnoDB. C'était facile et la façon dont je l'ai géré était d'utiliser mysqldump pour vider tout le contenu dans un fichier sql, utiliser un éditeur (sed) pour remplacer toutes les occurrences de MyISAM dans InnoDB puis recharger la base de données à partir de ce fichier. L'un des inconvénients est que vous ne pouvez pas récupérer d'espace à partir d'une base de données InnoDB (IIRC), mais tant que vous conservez vos tables en double dans une base de données distincte, vous ne devriez avoir aucun problème. Oh, et nous avons vu une augmentation significative des performances. Et parce que nous avons quatre instances Drupal, le grand nombre de fichiers de table a été éliminé du système de fichiers (oui, ils sont contenus dans le fichier InnoDB lui-même). C'est ma valeur de 0,02 $.

bobmct
la source
2
Avoir un seul espace de table InnoDB peut vous faire économiser des inodes, mais (comme vous le mentionnez vous-même) au détriment de l'espace disque. Même si vous supprimez un grand nombre de données, vous ne pourrez pas récupérer cet espace disque. Cela entraîne également des fichiers de sauvegarde volumineux inutiles et l'impossibilité de restaurer des tables uniques. C'est pourquoi je préfère utiliser l' innodb_file_per_tableoption.
geewiz
1
En outre, vous pouvez convertir des tables en place: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Ajoutez des options appropriées ( -uroot -psomepass, par exemple) aux deux mysqls si nécessaire.
BMDan
5

Juste un avertissement. Si vous êtes sur Drupal 6, vous pouvez installer le module DBTuner ; il peut facilement déplacer vos tables de MyISAM vers InnoDB. Alors oui, il y a un module pour ça!

mikeytown2
la source