Tables et index
Une table est la structure qui va stocker les informations par colonnes. Chaque colonne disposant d’un type particulier.
Creer une table
CREATE TALE nom_table ( definition_colonne[, ...] ) options_table ;
Une table doit contenir au minimum une colonne.
Une table peut contenir au minimum 0 ligne.
Définition de colonnes
Syntaxe :
nom type options
Il existe trois grands type de données en MySQL :
- les nombres
- les chaines
- le temporel
Les nombres
Les nombres se subdivisent en deux catégories : les entiers et les décimaux
Entiers
| Type | Nombre d’octets | Valeur min. | Valeur max. | Signe |
| BIT | 1 à 8 | |||
| TINYINT | 1 | -128 0 |
127 255 |
SIGNED (négatif) UNSIGNED (positif) |
| SMALLINT | 2 | -32768 0 |
32767 65535 |
SIGNED (négatif) UNSIGNED (positif) |
| MEDIUMINT | 3 | -2e23 0 |
2e(23-1) 2e24 |
SIGNED (négatif) UNSIGNED (positif) |
| INT | 4 | -2e31 0 |
2e(31-1) 2e32 |
SIGNED (négatif) UNSIGNED (positif) |
| BIGINT | 8 | -2e63 0 |
-2e(63-1) 2e64 |
SIGNED (négatif) UNSIGNED (positif) |
| BOOLEAN | Alias de tinyint(1) | |||
ATTENTION : Pour le type BIT, le nombre d’octets alloué a la colonne est spécifié par la valeur mise entre parenthese apres BIT(n)
Les décimaux
| Type | Nombre d’octets | Valeur min. | Valeur max. | Précision |
| FLOAT | 4 | -3.4e38 | 3.4e38 | 7 |
| DOUBLE | 8 | -1.7e308 | 1.7e308 | 14 |
| DECIMAL | variable | au choix |
ATTENTION : Pour le type DECIMAL(m,n), on définit m et n les limites. m : le nombre de chiffre total et n : le nombres de chiffres apres la virgule
Ex : DECIMAL(5,2) => 666.23
ATTENTION : Les FLOAT et DOUBLE sont victimes d’erreurs : C’est le processeur qui calcul.
Les chaines
Il exsite deux catégories de chaines : les chaines textuelles et les chaines binaires.
N = Taille max de la chaine en nombre de caracteres
C = Taille de la chaine à stocker en nombre de caracteres
T = Taille du plus grand caractere du jeu de caractere
T’ = Taille réelle du caractere du jeu de caractere
Les types Texte
| Types | Taille sur le disque (en octets) |
Taille Min N | Taille Max N | Remarques |
| CHAR(N) | N * T’ | 0 | 255 | Taille fixe |
| VARCHAR(N) | (C * T) +1 si C<256 sinon +2 |
0 | 65365 | Taille variable |
| TINYTEXT(N) | (C * T) +1 | 0 | 255 | |
| TEXT(N) | (C * T) +2 | 0 | 65365 | |
| MEDIUMTEXT(N) | (C * T) +3 | 0 | 2e24 | |
| LONGTEXT(N) | (C * T) +4 | 0 | 2e32 |
Les types binaires
| Types | Taille sur le disque (en octets) |
Taille Min N | Taille Max N | Remarques |
| BINARY | N | 0 | 255 | Taille fixe |
| VARBINARY | C * T’ +1 si<256 sinon +2 |
0 | 65535 | Taille variable |
| TINYBLOB | C * T’ +1 | 0 | 255 | |
| BLOB | C * T’ +2 | 0 | 65535 | |
| MEDIUMBLOB | C * T’ +3 | 0 | 2e24 | |
| LONGBLOB | C * T’ +4 | 0 | 2e32 |
Les chaines spéciales
- ENUM : Permet de spécifier les valeurs autorisées dans la colonne. Attention : 0 étant réservé pour la chaine vide
Sa capacité de stockage varie entre 1 et 2 octets. Il est possible de spécifier 65535 valeurs possibles
Lors d’un ORDER BY, MYSQL les classes par ordre de référence et non par ordre de valeur.
Si on veut les classer par ordre de valeur, il faudra spécifier : CAST( champs VARCHAR( x ) )
ENUM('enum1','enum2',...) - SET : Permet de spécifier les valeurs autorisées dans la colonne. A contrario de ENUM, SET peut mettre plusieurs valeurs par colonne.
Sa capacité de stockage varien entre 1 et 8 octets. Il est possible de spécifier 64 valeurs possibles.
SET('set1','set2',...)
Les types Temporels
| Nom | Description | Plage de valeurs | Stockage |
| YEAR(n) | Représente les années sur 2 OU 4 digits au choix. | Sur 2 chiffres :
00 – 69 : Représente les années 2000 à 2069 70 – 99 : De 1970 à 1999 Sur 4 chiffres : de 1900 à 2155 |
1 octet |
| TIME(n) | Permet de représenter des durées | -838:59:59 à 838:59:59 |
3 octets |
| DATE | Permet de representer une date | 1000-01-01 à 9999-12-31 |
3 octets |
| DATETIME | Permet de représenter une date et heure associée | 8 octets | |
| TIMESTAMP | Represente une date et heure associée sous format sous format YYY-MM-DD HH:ii:ss | 0 = 1er janvier 1970 jusqu’à 2037 |
Les options
Les options pour les numériques
| Nom | Description |
| AUTO_INCREMENT | Si et seulement si la colonne est de type entier. Incrémente la valeur automatiquement si aucune valeur n’est renseignée.
Ne comble pas les vides On ne peut avoir qu’une seule colonne de type AUTO_INCREMENT par table. Cette meme colonne doit avoir un index Si on souhaite que la table ne commence pas par 1, on modifiera la valeur avec : ALTER TABLE t1 AUTO_INCREMENT x; ATTENTION : Avec AUTO_INCREMENT, on dispose de la fonction LAST_INSERT_ID. Cette fonction retournant la valeur du dernier ID lors du dernier insert |
| UNSIGNED | Cette option indique que le type peut avoir des valeurs positives. |
| SIGNED (par défaut) | Cette option indique que le type peut avoir des valeurs négatives. |
| ZEROFILL | Permet de spécifier les 0, uniquement pour les types entiers UNSIGNED et les nombres ayant moins de chiffres que la taille d’affichage
EX : TINYINT(3) UNSIGNED ZEROFILL => va toujours de 0 à 255 mais comblera avec 3zeros : pour 4 : 004. |
Les options pour les chaines
| Nom | Description |
| CHARACTER SET | Uniquement pour les type de champ textuels et fonctionne comme pour les bases de données |
| COLLATE | Uniquement pour les type de champ textuels et fonctionne comme pour les bases de données |
| BINARY | Uniquement pour les type de champ textuels et demande l’utilisation de l’ordre d’interclassement binaire |
Les options pour les temporels
| Nom | Description |
| DEFAULT CURRENT_TIMESTAMP | Permet d’enregistrer les différentes dates d’ajout dans la table |
| ON UPDATE CURRENT_TIMESTAMP | Permet de mettre à jour la date à chaque changement sur la ligne |
ATTENTION : Dans la version >4.0, le premier TIMESTAMP de chaque tables fonctionnait comme si on avait un DEFAULT CURRENT_TIMESTAMP. Et un ON UPDATE CORRENT_TIMESTAMP
Les deux options ne sont pas cumulables.
Pour contourner ce probleme, il suffira de mettre à NULL la valeur d’une colonne de type TIMESTAMP NOT NULL. Et ceci permettra un TIMESTAMP courant.
Depuis MySQL 5.0, on peut ajouter un déclencheur (trigger) permettant de mettre à jour les differentes insertions
Avec la variable systeme TIME_ZONE, il est possible d’afficher la date dans un fuseau horaire différent.
Les options tous types
| Nom | Description |
| NULL | Indique que la colonne peut avoir des valeurs nulles (valeur par défaut) à l’exception de TIMESTAMP (not null) |
| NOT NULL | Indique que la colonne ne peut avoir de valeurs nulles (valeur par défau de TIMESTAMP) |
| DEFAULT | Permet de définir une valeur par défaut lors de l’insertion, lorsqu’on ne spécifie pas de valeurs pour une colonne.
DEFAULT est interdit pour les types TEXT et BLOB |
| NULL | Indique que la colonne peut avoir des valeurs nulles |
Definition des options de table
Les options de table permettent de définir le moteur de stockage d’une table. On utiilisera la mot clé ENGINE qui est remplacé par TYPE dans la version 5.0
CREATE TABLE table (
...
) {ENGINE|TYPE} = moteur;
Si on ne spécifie pas de moteur de stockage à la création de table, ce dernier sera MyISAM
Les données concernant les tables se retrouvent dans un ou plusieurs fichiers dans le repertoire de la base de données. Dans MySQL, chaque table dispose au minimum d’un fichier *.frm et ce quelque soit le moteur de stockage.
Ce fichier contient le format de la table : liste des colonnes, types, index, options
Sur MySQL, il existe différents types de moteurs de stockages :
- MyISAM
- InnoDB
- Memory
- Merge
- Archive
- BerkeleyDB (transactionnel, jusqu’a 5.0)/li>
- Falcon (transactionnel, à partir de 6.0)
- Maria (transactionnel, basé sur MyISAM)
- FEDERATED
MyISAM
C’est le moteur de stockage par défaut sur MySQL. Il ne peut etre désactivé
Lors de la création d’une table MyISAM, MySQL crée trois fichiers
| Nom | Description |
| *.frm | Va stocker la liste des colonnes, les valeurs par défaut, les index |
| *.MYD | MY ISAM DATA : Va stocker les enregistrements de la table |
| *.MY | MY ISAM INDEX : Stocke les index de la table |
Que peut on dire de MyISAM ?
Moteur efficace quand le taux d’ecriture est faible.
Supporte les techniques de verrouillage de tables : plusieurs personnes peuventlire la table en meme temps.
Avec ce moteur, si un utilisateur veux ecrire, tout les autres utilisateurs ne peuvent plus ecrire. L’interblocage est possible : MyISAM bloque toute les tables afin d’eviter de les bloquer les unes apres les autres.
MyISAM est le seul moteur de stockage supportant les index FULL TEXT
Il supporte :les données spatiales,les auto_increment
les tables de type MyISAM peuvent etre compressées (avec myisampack : passera les tables en lecture seule)
La taille maximum est de 65536To par tables.
Les fichiers sont portables d’une plateforme à une autre
InnoDB
InnoDB à été developpé par Oracle. Ce syteme de fichier supporte les transaction, les clés etrangères et respecte la norme ACID.
Ce type de fichiers permet une auto-réparation lors d’un crash grace au journal de requetes.
La taille maximum pour ce type de moteur est de 64To par tables.
Les tables de type InnoDB sont performantes dans les environnements mixte : lecture/ecriture
Les fichiers sont portables d’une plateforme à une autre
InnoDB peut etre désactivé. En désactivant InnoDB, on augmente les performances du serveur (skip-innodb)
Memory
Le moteur Memory stocke les données et les index dans la memoire vive.
C’est le moteur de stockage le plus performant pour la lecture verouillage de table mais pas à l’écriture.
Très interressant pour un volume de données peut volumineux.
Les données stockées par la table seront perdues au redémarrage.
On peut choisir le type d’index à créer : HASH ou BTREE.
La capacité de stockage est variable en fonction de la quantité de RAM.
ATTENTION : On ne peut utiliser les types TEXT et BLOB.
Merge
Table virtuelle regrouppant une collection de tables MyISAM
Ce comporte de la meme facon que les tables MyISAM
Dispose d’une syntaxe différente :
CREATE TABLE t1 (
...
) {ENGINE|TYPE} = MERGE UNION (T2,T3...);
ATTENTION : Les différentes tables doivent avoir la meme structure sur touts points.
Contient un *.frm et un *.mrg qui contient les chemins de chaques tables rattachées
ATTENTION : Lors de l’insertion : il faudra spécifier lors de la création du merge la méthode d’insertion avec : INSERT_METHOD={FIRST|LAST|NO} et ceci permettra d’ajouter les données dans l’ordre de création de table.
Archive
Permet de stocker de grande quantité d’informations.
Les données sont donc compressées (taux ~40%)
Les seules opérations possible dans ses tables sont SELECT et INSERT
Contient un *.frm, un *.arm (ARchive Metadata), un *.arz (ARchive Zip)
Ce moteur de stockage est beaucoup plus performant dans la compression que celui de myisampack.
BerckleyDB
BerckelyDB à été crée par Oracle, supporte les transactions et respecte les normes ACID et l’auto-recuperation
Sont systeme de vérouillage est un vérouillage par table, page etant ensemble des lignes successives dans la table
Ce fichier génére un *.frm et un *.db.
Il n’est pas compatible de plate-forme à plate forme.
Berckley enregistre sont propre chemin
FEDERATED
FEDERATED permet d’acceder à des tables se trouvant sur d’autres serveurs avec la syntaxe :
CREATE TABLE t1 (
...
) {ENGINE|TYPE} = FEDERATED CONNECTION ="chaine de connexion"
//chaine de connexion
mysql://user:password@host:port/db/table
Les tables temporaires
Elles sont visibles unquement par les createurs
Sont suprimées automatiquement lors de la cloture de la session
Peut porter le meme nom qu’une table existente (non temporaire), elle primera par rapport à cette derniere
Il est aussi possible de spécifier l’auto increment
CREATE TEMPORARY TABLE myTable ( ... ) AUTO_INCREMENT = 100;
Il est aussi possible de spécifier un commentaire, son jeu de caracter et son ordre de tri
Les options de tables sont séparées par des espaces
CREATE TABLE myTable ( ... ) AUTO_INCREMENT=100 COMMENT="blaaaa" CHARSET=utf8 COLLATE=utf8_bin;
Supprimer une table
DROP TABLE t1[,t2,t3...];
Modifier une table
On peut modifier une table sur différents contextes (ajouter une colonne, supprimer une colonne, modifier les options d’une colonne, changer le nom d’une colonne,renommer une colonne)
On utilisera constament les mots clés ALTER
Ajouter un champ
//En début de table ALTER TABLE table ADD colonne type options FIRST; //En fin par défaut ALTER TABLE table ADD colonne type options; //Apres une certaine colonne ALTER TABLE table ADD colonne type options AFTER colonne;
Modifier un champ
//Modifier les types et options UNIQUEMENT ALTER TABLE table MODIFY colonne type options; //Modifier les noms, types et options ALTER TABLE table CHANGE colonne nouveau_nom_colonne type options;
Supprimer un champ
ALTER TABLE table DROP colonne;
Renommer une table
ALTER TABLE table RENAME TO table_renomme; // OU RENAME table TO table_renomme [,table2 TO table2_renomme, ...];
Modifier les options de table
SET storage_engine = nouveau_moteur; // OU ALTER TABLE table OPTION=opt1 opt2 ...;
Index
Les index ont deux roles. Ils ont dans un premier temps le rôle d’assurer l’unicité des valeurs dans une colonne et
accelere les recherches mais ralentis les opérations de modifications.
Il ne faut pas indexer trop/toutes les colonnes dans une table.
MySQL met en cache les index, les index consomme donc des ressources : memoire et processeur.
Il faut placer 4 à 5 index dans une table au maximum.
On ajoute un index si une table contient plus de 100 lignes.
Les types d’index
Il existe différents types d’index tels que :
- PRIMARY KEY : Index à valeur unique n’acceptant pas les NULL (UNE par table)
- UNIQUE : Index à valeur unique acceptant les NULL
- INDEX : Index à valeur multiple pouvant accepter les NULL
- FULLTEXT : Index à mettre uniquement pour les types TEXT, spécialisé dans la recherche textuelle (MyISAM uniquement)
- [ SPATIAL : Pour les données spatiales : données géometriques (MyISAM uniquement)]
Création d’index
Il est possible de crée un index de deux manieres différentes : lors de la création d’une table ou apres sa création.
CREATE TABLE maTable( I smallint PRIMARY KEY, C char(200) UNIQUE );
Ou :
CREATE TABLE maTable( I smallint, C char(200), PRIMARY KEY (I), UNIQUE [`myIndex`] (C) );
Ou :
CREATE {UNIQUE|INDEX|FULLTEXT|SPATIAL} nomIndex ON table
Ou encore :
INDEX `monIndex` ON table.champ
Le nom de l’index est unique pour l’ensemble de la base
ALTER TABLE table ADD PRIMARY KEY||FULLTEXT||SPATIALINDEX (nomColonne);
ATTENTION : Ne jamais créer d’index sur un serveur en production car MySQL prend beaucoup de temps pour créer un index. Pendant ce temps, MySQL pause un vérrou sur cette table ce qui rend indisponible la table pour lecture/ecriture
Supprimer un Index
DROP INDEX monIndex ON table //Ou ALTER TABLE table DROP PRIMARY KEY ALTER TABLE table DROP INDEX monIndex
Alogorythme d’index
Il existe deux algorythmes d’index :
- Le HASH
- Le BTREE
Seul Memory accepte l’algorythme HASH
HASH
C’est une fonction de hachage utilisé pour obtenir le résumé d’une information
Prends une informations relativement grande, la réduit, il obtiendra 2 informations relativement différente et forcément deux resumé différents
HASH Index est implémenté à l’aide d’une table de hachage telle que md5.
Ce type d’algo est utile uniquement lors de la comparaison.
//C index hash SELECT * FROM C=2
BTREE
Pour tout les moteurs de stockage. Index implémenté sous forme d’arbre équilibré.
Mieux adapté pour les recherche sur des plages de valeurs
Syntaxe :
//Nouveauté MySQL5
CREATE TABLE t1 (
i int,
INDEX USING{BTREE|HASH}(i)
);
Particularité d’index
//ERREUR : CREATE TABLE t1 ( i int, c int, INDEX USING BTREE(i) INDEX USING BTREE(c) ); //BON : CREATE TABLE t1 ( i int, c int, INDEX USING BTREE(i,c) );
ATTENTION :
• MySQL ne peut utiliser qu’un seul Index par table
• La taille d’un enregistrement d’index est limité à 767octets sur InnoDB et 1000octets sur MyISAM. Il est donc impossible d’indexer des colonnes ayant un type de données dépassant cette taille.
//Permet de prendre les 100 premiers octets de la colonne //pour eviter le dépassement de limite CREATE TABLE maTable( c varchar(50000), INDEX(c(100)) );
Visualiser les Index
Cf. DESCRIBE. Il existe un alias de DESCRIBE : DESC.
SHOW INDEX FROM table
NOTE
• Est-il possible de créer pour une seule colonne divers index?
Oui
• Sur une table possedant les index PRIMARY KEY, UNIQUE, INDEX, lors de du premiers DESC, visualiserons nous les memes informations apres un drop de l’index PRIMARY KEY sur le second DESC?
Oui, car dans notre exemple, notre colonne est un entier NOT NULL, l’index UNIQUE devient automatiquement clé primaire.
FOREIGN KEY (pas au programme de la certification)
FOREIGN KEY se crée et se supprime comme une clé primaire. FOREIGN KEY n’est pas au programme de la certification MySQL5. Disponible uniquement pour les tables InnoDB
Pour assurer l’atomicité d’une base de données, il existe les options
- ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}
- ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}
CREATE TABLE parent ( id int PRIMARY KEY ); CREATE TABLE enfants ( id int PRIMARY KEY, id_parent int, FOREIGN KEY (id_parent) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB;
CASCADE : effectue les modifications en cascade
RESTRICT : on ne peut pas modifier les enregistrements qui sont liés
SET NULL : met a NULL les colonnes liés
Commentaires récents