Ce qui est plus rapide: char(1) ou de type tinyint(1) ? Pourquoi?
DE MA PLATE-FORME:
PHP & mySQL
MA SITUATION:
Je suis tombé sur une situation où j'ai besoin de stocker une valeur pour la sélection de l'utilisateur dans l'une de mes colonnes d'une table. Maintenant, mes possibilités:
- Soit déclarer la Colonne de type char(1) et de stocker la valeur 'y' ou 'n'
- Ou de déclarer la Colonne de type tinyint(1) et de stocker la valeur 1 ou 0
- Cette colonne déclarée, peut aussi être indexés pour l'utilisation dans l'application.
MES QUESTIONS:
Donc je voulais savoir laquelle de ces deux types:
-
Conduit à une accélération de la vitesse des requêtes lorsque cette colonne est accessible (par souci de simplicité, nous allons laisser de côté le mélange d'autres requêtes, ou accéder à d'autres colonnes, s'il vous plaît).
-
Est le moyen le plus efficace de stocker et d'accéder à des données et pourquoi?
-
Comment la vitesse d'accès varier si les colonnes sont indexées et quand ils ne le sont pas?
Ma compréhension est que, depuis char(1) et de type tinyint(1), ne représentent que 1 octet de l'espace, de l'espace de stockage ne sera pas un problème dans ce cas. Alors que resterait-est de la vitesse d'accès. Autant que je sache, numérique indexation est plus rapide et plus efficace que n'importe quoi d'autre.
Mais le cas ici est difficile de décider, je pense. Vraiment envie d'entendre votre expérience sur celui-ci.
Vous en remercie d'avance.
- Profil et laissez-nous savoir les resoult.
- Une fausse dichotomie, il y a aussi
enum('1','0')
(par exemple). - la question n'a rien à voir avec php, donc j'ai enlevé la balise php
- L'indexation d'un champ avec deux valeurs possibles est assez inutile.
- Le type de la colonne a peu d'influence sur sa pertinence à des fins d'indexation. Si vous mettez la colonne dans un
WHERE
clause et il n'y a aucun indice de sa va faire un full table scan quel que soit le type. - WOW! Ne pas s'attendre à ce que cette question serait même vu & a répondu à plusieurs reprises, dans un petit moment. @erenon: Pardon pour mon ignorance, mais comment dois-je faire? Ne phpmyadmin est un outil pour que (je ne sais qui encore) @ricebowl Bonne, mais il y a un truc en elle, comme mentionné par Langdon. Veuillez vous référer à son commentaire. @streetparade: c'est ok, mais regarde comme il a aidé les autres utilisateurs comme Matchu et Zombat pour spécifier un point dans leur commentaire. @récursive je suis d'accord avec Schwern totalement sur ce point. Sur une table avec un million de lignes, un no-index scan serait inutile. Donc, bon à utiliser.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devriez créer une colonne avec
ENUM('n','o')
. Mysql magasins de ce type dans des conditions optimales. Il sera également vous aider à stocker uniquement les valeurs autorisées dans le domaine.Vous pouvez aussi le rendre plus conviviale
ENUM('no','yes')
sans affecter les performances. Parce que les chaînes de'no'
et'yes'
sont stockés qu'une seule fois parENUM
définition. Mysql stocke uniquement de l'indice de la valeur par ligne.Aussi la note sur le tri par
ENUM
colonne:il semble que, pour la plupart,
enum('y', 'n')
est plus rapide à insérer dans.La sélection semble être également à l'
enum
. Le Code peut être trouvé iciÀ l'aide de tinyint est plus pratique, et vous permettra de plus facilement vérifier la valeur du champ.
Je ne suis pas un expert dans le fonctionnement interne de MySQL, mais il se sent intuitivement que récupération et de tri des champs de type entier est plus rapide que des champs de caractère (j'ai juste le sentiment que 'a' > 'z' est plus de travail que 0 > 1), et semble se sentir beaucoup plus familier à partir d'un calcul de point de vue de 0 et de 1 sont le standard on/off drapeaux. De sorte que le stockage pour les entiers, qui semble mieux, il se sent mieux, et est plus facile à utiliser dans le code de la logique. 0/1 est le gagnant clair pour moi.
Vous pouvez également noter que, dans une certaine mesure, c'est MySQL, la position officielle, ainsi, de leur documentation:
Si MySQL va jusqu'à assimiler TINYINT(1) avec l'opérateur BOOLÉEN, il semble que le chemin à parcourir.
De savoir pour sûr, vous devriez comparer. Ou savez qu'il ne sera probablement pas beaucoup d'importance dans le grand point de vue de l'ensemble du projet.
Les colonnes de type Char ont les codages et les classements, et en les comparant pourrait impliquer inutile bascule entre les encodages, donc j'imagine qu'un int sera plus rapide. Pour la même raison, je pense que la mise à jour d'un index sur une colonne int est également plus rapide. Mais encore une fois, il ne sera pas question beaucoup.
CHAR
peut prendre plus d'un octet, selon le jeu de caractères et les options de la table que vous choisissez. Certains personnages peuvent prendre trois octets pour coder, donc MySQL parfois se réserve cet espace, même si vous utilisez uniquementy
etn
.Ils vont tous deux être si proche qu'il n'a pas d'importance. Si vous vous sentez posez cette question, vous êtes en sur-optimisation. Utilisation selon l'une qui fait le plus de sens logique.
Si vous spécifiez les types
BOOL
ouBOOLEAN
comme un type de colonne lors de la création d'une table dans MySQL, il crée le type de colonne commeTINYINT(1)
. Sans doute c'est le plus rapide des deux.La Documentation
Aussi:
Alors que mon intuition est qu'un index sur un TINYINT serait plus rapide qu'un index sur un CHAR(1) en raison du fait qu'il n'existe pas de chaîne de manutention, les frais généraux (classement, d'espaces, etc), je n'ai pas faits pour. Ma conjecture est qu'il n'y a pas une différence de performances significative qui vaut la peine de s'inquiéter.
Cependant, parce que vous êtes à l'aide de PHP, de stockage comme un TINYINT fait beaucoup plus de sens. À l'aide de la 1/0 valeurs est équivalent à l'utilisation de
true
etfalse
, même quand ils sont retournés comme des chaînes de caractères en PHP, et peuvent être traités comme tels. Vous pouvez simplement faire unif ($record['field'])
avec vos résultats sous la forme d'un booléen vérifier, au lieu de convertir entre " y " et " n " de tous les temps.est-il différent?