Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment choisir des types de données optimisés pour les colonnes [spécifique à innodb] ?

Bref résumé :

(juste mon avis)

  1. pour l'adresse e-mail - VARCHAR(255)
  2. pour le nom d'utilisateur - VARCHAR(100) ou VARCHAR(255)
  3. pour id_username - utilisez INT (sauf si vous prévoyez plus de 2 milliards d'utilisateurs dans votre système)
  4. numéros de téléphone - INT ou VARCHAR ou peut-être CHAR (cela dépend si vous souhaitez stocker la mise en forme)
  5. messages - TEXT
  6. dates - DATE ou DATETIME (incluez certainement les heures pour des choses comme les publications ou les e-mails)
  7. argent - DECIMAL(11,2)
  8. divers - voir ci-dessous

En ce qui concerne l'utilisation d'InnoDB car VARCHAR est censé être plus rapide, je ne m'en soucierais pas, ni de la vitesse en général. Utilisez InnoDB car vous devez effectuer des transactions et/ou vous souhaitez utiliser des contraintes de clé étrangère (FK) pour l'intégrité des données. De plus, InnoDB utilise le verrouillage au niveau de la ligne alors que MyISAM n'utilise que le verrouillage au niveau de la table. Par conséquent, InnoDB peut mieux gérer des niveaux de concurrence plus élevés que MyISAM. Utilisez MyISAM pour utiliser des index de texte intégral et pour un peu moins de surcharge.

Plus important pour la vitesse que le type de moteur :placez des index sur les colonnes sur lesquelles vous devez effectuer une recherche rapide. Mettez toujours des index sur vos colonnes ID/PK, comme l'id_username que j'ai mentionné.

Plus de détails :

Voici un tas de questions sur les types de données MySQL et la conception de la base de données (attention, plus que ce que vous avez demandé) :

Et quelques questions sur quand utiliser le moteur InnoDB :

J'utilise juste tinyint pour presque tout (sérieusement).

Modifier - Comment stocker les "messages :"

Vous trouverez ci-dessous quelques liens avec plus de détails, mais voici la version courte. Pour stocker des "messages", vous avez besoin d'espace pour une longue chaîne de texte. CHAR la longueur maximale est de 255, donc ce n'est pas une option, et bien sûr CHAR gaspillerait des caractères inutilisés par rapport à VARCHAR , qui est de longueur variable CHAR .

Avant MySQL 5.0.3, VARCHAR la longueur maximale était de 255, il vous resterait donc TEXT . Cependant, dans les nouvelles versions de MySQL, vous pouvez utiliser VARCHAR ou TEXT . Le choix se résume à la préférence, mais il y a quelques différences. VARCHAR et TEXT la longueur maximale est maintenant de 65 535, mais vous pouvez définir votre propre max sur VARCHAR . Disons que vous pensez que vos messages n'auront besoin que de 2000 max, vous pouvez définir VARCHAR(2000) . Si vous dépassez tous les limites, vous pouvez ALTER vous tablez plus tard et remplacez-le par VARCHAR(3000) . Par contre, TEXT stocke en fait ses données dans un BLOB (1). J'ai entendu dire qu'il pouvait y avoir des différences de performances entre VARCHAR et TEXT , mais je n'ai vu aucune preuve, donc vous voudrez peut-être approfondir cela, mais vous pouvez toujours modifier ce détail mineur à l'avenir.

Plus important encore, rechercher cette colonne "post" en utilisant un index de texte intégral au lieu de LIKE serait beaucoup plus rapide (2). Cependant, vous devez utiliser le moteur MyISAM pour utiliser l'index de texte intégral car InnoDB ne le prend pas en charge . Dans une base de données MySQL, vous pouvez avoir un mélange hétérogène de moteurs pour chaque table, il vous suffira donc de faire en sorte que votre table "posts" utilise MyISAM. Cependant, si vous avez absolument besoin de "posts" pour utiliser InnoDB (pour les transactions), configurez un déclencheur pour mettre à jour la copie MyISAM de votre table "posts" et utilisez la copie MyISAM pour toutes vos recherches en texte intégral.

Voir en bas pour quelques citations utiles.

Enfin, voici un excellent article sur les avantages et les inconvénients de VARCHAR par rapport à TEXT. Cela concerne également le problème de performances :