Une table ne peut pas contenir plus de 1000 colonnes.
La taille maximale d'une clé est de 1024 octets.
La taille maximale d'une ligne, hormis pour les colonnes de
type BLOB
et TEXT
, et
légèrement inférieure à la moitié d'une page de base,
c'est à dire, que la taille maximale d'une ligne est
d'environs 8000 octets. Les colonnes
LONGBLOB
et LONGTEXT
doivent être un peut plus petite que 4Go, et la taille totale
d'une ligne, incluant les colonnes BLOB
et
TEXT
doivent être de 4 Go.
InnoDB
stocke les 512 premiers octets des
valeurs BLOB
et TEXT
dans la ligne, et le reste dans une page séparée.
Sur certains systèmes d'exploitation, le fichier de données est limité à 2 Go.
La taille combinée des fichiers de log doit être inférieure à 4 Go.
La taille minimale d'un espace de tables est de 10Mo. La taille maximale d'un espace de tables est de 4 milliards de pages de bases (64To). C'est aussi la taille maximal d'une table.
Les tables InnoDB
ne supportent pas les
index FULLTEXT
.
Sous Windows, InnoDB
stocke les noms de
bases de données et les noms de tables en interne, et en
minuscule. Pour passer une base au format binaire de Unix à
Windows, ou le contraire, vous devez créer toutes vos bases
et tables en minuscules.
Attention : NE
convertissez PAS les tables de droits du format
MyISAM
en InnoDB
! Cela
n'est pas supporté. Si vous faîtes cela, MySQL ne va pas
redémarrer jusqu'à ce que vous restauriez vos données avec
une vieille sauvegarde, ou que vous regénériez ces tables
avec le script mysql_install_db
.
InnoDB
ne conserve pas de compte interne de
ligne pour une table. Cela serait en fait compliqué, à cause
du multi-versionnage. Pour traiter une commande
SELECT COUNT(*) FROM T
,
InnoDB
doit scanner l'index de la table, ce
qui prendra du temps si la table n'est pas enregistrée dans
le buffer. Pour accélérer le compte, vous devez créer un
compteur de table vous-même, et votre application le
modifiera à chaque ajout ou suppression. Si votre table ne
change pas souvent, l'utilisation du cache sera une bonne
solution. SHOW TABLE STATUS
peut aussi
être utilisé pour obtenir un décompte approximatif des
lignes. See Section 15.12, « Conseils pour l'amélioration des performances InnoDB
».
Pour une colonne AUTO_INCREMENT
, vous devez
toujours définir un index pour la table, et cet index doit
contenir uniquement la colonne
AUTO_INCREMENT
. Dans les tables
MyISAM
, la colonne
AUTO_INCREMENT
peut faire partie d'un index
multi-colonne.
InnoDB
ne supporte pas l'option de
configuration initale des colonnes
AUTO_INCREMENT
dans les commandes
CREATE TABLE
ou ALTER
TABLE
. Pour configurer cette valeur avec une table
InnoDB
, insérez une ligne avec une valeur
inférieure d'une unité à votre valeur de départ, ou bien
insérez la première ligne en spécifiant la première
valeur.
Lorque vous redémarrez le serveur MySQL,
InnoDB
peut réutiliser une ancienne valeur
de la séquence AUTO_INCREMENT
(c'est à
dire, une valeur qui a été assignée à une transaction
annulée).
Lorsque la colonne AUTO_INCREMENT
n'a plus
de valeurs, InnoDB
passe le
BIGINT
à
-9223372036854775808
et les BIGINT
UNSIGNED
à 1
. Cependant, les
valeurs BIGINT
sont codées sur 64 bits,
alors même si vous insérez 1 million lignes par seconde,
cela vous prendra un million d'années avant d'atteindre la
limite des BIGINT
. Avec les autres types de
colonnes, une erreur de clé doublon sera émise. C'est
identique au fonctionnement des tables
MyISAM
, le comportement générale de
MySQL, et ce n'est pas caractéristique d'un moteur
spécifique.
DELETE FROM TABLE
ne regénère pas la
table, mais au lieu de cela, il efface les lignes une à une,
ce qui est bien plus lent. Dans les prochaines versions, MySQL
va pouvoir utiliser la commande TRUNCATE
qui est très rapide.
TRUNCATE tbl_name
est synonyme de
DELETE FROM tbl_name
pour
InnoDB
et ne remet pas à zéro le compteur
de AUTO_INCREMENT
.
SHOW TABLE STATUS
ne donne pas de
statistiques exactes pour les tables
InnoDB
, hormis pour la taille physique
réservée par la table. Le nombre de lignes n'est qu'une
estimation utilisée pour les optimisations SQL.
Si vous essayez de créer un index unique sur un préfixe d'une colonne, vous allez obtenir une erreur :
CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB;
Si vous créez un index non-unique sur un préfixe de colonne,
InnoDB
va créer un index pour toute la
colonne.
Ces restrictions sont levées depuis les versions 4.0.14 et 4.1.1.
INSERT DELAYED
n'est pas supportés par les
tables InnoDB
.
La commande MySQL LOCK TABLES
ne reconnait
pas le verrouillage de ligne InnoDB
réalisé dans les commandes SQL achevées : cela signifie
que vous pouvez poser un verrou sur une table même si il
existe une transaction qui a été posée par un autre
utilisateur. Par conséquent, votre opération doit attendre
que les autres tables soient libres, et elle peut aussi entrer
en conflit avec une autre requête. De plus, un blocage de
verrous est possible mais il ne met pas en danger
l'intégrité des transactions, car le verrou de ligne posé
par InnoDB
se charge toujours de
l'intégrité. Enfin, un verrou de table évite aux autre
transactions de poser un verrou de ligne (en conflit avec le
mode de verrous) sur la table.
Avant MySQL 3.23.52, la réplication fonctionnait toujours en mode d'auto-validation. Par conséquent, les lectures cohérentes de l'esclaves voyait aussi les transactions partiellement traitées, et la cohérence n'était pas assurée. Cette restriction a été levée en MySQL 3.23.52.
La commande LOAD TABLE FROM MASTER
de
configuration de la réplication ne fonctionne pas pour les
tables InnoDB
. Un palliatif consiste à
modifier la table en MyISAM
sur le maître,
faire la configuration, puis repasser la table en format
InnoDB
.
La taille par défaut d'une page de base avec
InnoDB
est de 16Ko. En recompilant le code,
vous pouvez donner une valeur allant de 8Ko à 64Ko. Vous
mettre à jour les valeurs des constantes
UNIV_PAGE_SIZE
et
UNIV_PAGE_SIZE_SHIFT
dans le fichier
univ.i
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.