Question

Je suis optimaliser et individualiser certaines tables InnoDB dans MySQL, alors j'ai couru Procédure analsye () pour voir ce que les recommandations ont été.

Les résultats recommandés tinytext au lieu de varchar (255) pour tous les domaines précédemment définis comme varchar (255)

Y at-il un gain de performance à l'aide avait tinytext ? Je suis seulement préoccupé par la vitesse ici, pas la taille.

Était-ce utile?

La solution

Ne croyez pas si quelqu'un vous dit que TINYTEXT est stocké d'une autre manière, que VARCHAR.

Les différences réelles sont:

  • TINYTEXT et d'autres champs texte sont stockés séparément de la ligne en mémoire à l'intérieur tas MySQL, alors que les champs VARCHAR () ajouter jusqu'à 64k limite (vous pouvez donc avoir plus de 64k en TINYTEXTs, alors que vous ne serez pas avec VARCHAR).

  • TINYTEXT et d'autres domaines « blob comme » forceront couche SQL (MySQL) d'utiliser des tables temporaires sur le disque chaque fois qu'ils sont utilisés, alors que VARCHAR sera encore classée « en mémoire » (bien que sera converti en CHAR pour la largeur).

  • InnoDB ne se soucie pas vraiment en interne que ce soit tinytext ou varchar. Il est très facile de vérifier, créer deux tables, une avec VARCHAR (255), un autre avec TINYINT et insérer un enregistrement à la fois. Ils ont tous deux prendront seule page 16k -. Alors que si les pages de débordement sont utilisées, table TINYTEXT devrait apparaître comme prenant au moins 32k dans 'TABLE SHOW STATUS'

Je préfère habituellement VARCHAR (255) - ils ne causent pas trop de fragmentation de tas pour la ligne simple, et peut être traité comme seul objet 64k en mémoire dans MySQL. Sur les différences de taille InnoDB sont négligeables.

Autres conseils

Je pense varchar être plus rapide que tinytext, et de mon googler autour qui semble être le consensus général. Bien sûr, vous devez tester votre système pour être vraiment certain.

La raison pour laquelle il est plus rapide parce que quand MySQL fait certains types d'opérations (jointures, sortes, etc.), il sera souvent créer des tables temporaires. Lorsque vous avez un type de blob (comme tinytext) dans une table temporaire de la table sera disque à base plutôt que la mémoire à base, ce qui bien sûr aurait un impact sur les performances.

CHAR / VARCHAR va être plus rapide que ces colonnes sont stockées dans la même page que la principale ligne de données *, alors que les types de texte sont stockés hors page (je me trompais, voir le commentaire par Harrison ).

Les gens à utiliser tinytext beaucoup parce que varchar (fâcheusement) rognée les espaces de fin. Ce comportement a été supprimé en MySQL 5.0.

(* Au moins pour les premiers 768 octets, et avec InnoDB, non intégré dans le nouveau plugin InnoDB).

Vous pouvez également envisager d'utiliser char(255) - alors qu'il n'utilise plus d'espace, il a été beaucoup plus rapide (dans mon expérience) d'utiliser un champ qui est une taille constante lorsque vous faites des comparaisons plus tard. L'espace supplémentaire peut être rempli avec un rembourrage si vous cherchez juste vitesse, puis les espaces blancs plus tard ignorer.

Toutefois, notez: MySQL ne permettra pas et varchar types d'exister char dans la même table. Cela ne veut pas [habituellement] permet des comparaisons entre et <=> <=>. J'ai trouvé l'année dernière lorsque vous faites une mise en œuvre de la table pour un passe-temps projet .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top