Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
elearning:workbooks:mysql:my08 [2020/01/30 03:29] – modification externe 127.0.0.1 | elearning:workbooks:mysql:my08 [2023/11/20 12:51] (Version actuelle) – created admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ~~PDF: | ||
- | |||
**Version**: | **Version**: | ||
- | ====== | + | ======SER407 |
- | =====Présentation de MySQL===== | + | =====Matériel===== |
- | %%MySQL%% comprend les outils suivants : | + | ====Processeur==== |
- | * **Un Serveur SQL** | + | La vitesse |
- | * Un moteur qui permet | + | |
- | * **Les programmes clients pour accéder aux serveurs** | + | |
- | * Un programme interactif permet de saisir directement les requêtes et d'afficher les résultats | + | |
- | * Plusieurs utilitaires et outils d' | + | |
- | * **Une bibliothèque client pour écrire vos propres programmes** | + | |
- | * Les programmes clients peuvent être écrits en C, car la bibliothèque est elle-même écrite en C. | + | |
- | * Elle intègre également toutes les bases nécessaires pour supporter | + | |
- | ====Développement==== | + | ====Mémoire==== |
- | Le développement de MySQL depuis son rachat par la société Oracle en 2009 produit des versions différentes selon le cycle suivant : | + | La mémoire est un facteur critique pour le serveur MariaDB. La donnée |
- | * Création de une ou plusieurs versions successives dites **DMR** (// | + | ====Disque Dur==== |
- | * La sortie d'une ou de plusieurs versions successives dites **RC** (//Release Candidate// | + | |
- | * La sortie d'une version dite **GA** ((// | + | |
- | <WRAP center round important 60%> | + | Les performances d'un disque dur se mesurent avec deux paramètres, |
- | **Important** - A noter que MySQL existe en version 32 bits et 64 bits. | + | |
- | </ | + | |
- | MySQL existe en deux versions, la version communautaire qui est disponible sous la licence **[[http:// | + | =====Système d' |
- | * bénéficie | + | MariaDB est disponible pour Windows(tm), |
- | * contient des outils tels Enterprise Monitor, Query Analyzer | + | |
- | <WRAP center round important 60%> | + | =====Cache de Requêtes===== |
- | **Important** - A noter qu'à un instant t, la version communautaire et la version Entreprise sont indentique. | + | |
- | </ | + | |
- | Ce cours se concentre sur la version communautaire. | + | Le cache des requêtes est utilisé par MariaDB lors des requêtes de type SELECT. Le cache est utile dans le cas où la majorité des requêtes sont de type lecture. Lors d'un SELECT, MariaDB vérifie si la requête est déjà dans le cache. Cette vérification est faite pour **toutes** les requêtes, mêmes celles qui sont **impropres**. Il ne faut donc **pas** activer le cache quand : |
- | ====Protocoles de Communication==== | + | * les écritures sont nombreuses, |
+ | * les lectures ne sont pas répétées, | ||
+ | * le requêtes sont en grande partie **impropre**. | ||
- | MySQL propose 4 protocoles | + | L' |
- | ^ Protocole ^ Connexion ^ OS ^ Commentaire ^ | + | < |
- | | TCP | Local et distant | Unix, Windows | Seul protocole de connexion à distance | | + | MariaDB [(none)]> |
- | | Socket Unix | Local | Unix | Protocole par défaut pour les connexions locales | + | +------------------+-------+ |
- | | Shared Memory | + | | Variable_name |
- | | Named Pipes | Local | Windows | Fichier permettant deux processus sans lien de parenté de communiquer | | + | +------------------+-------+ |
+ | | query_cache_type | ||
+ | +------------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
- | <WRAP center round important 60%> | + | MariaDB [(none)]> |
- | **Important** - Le port TCP par défaut de MySQL est le **3306**. Il est possible de changer le port de communication de MySQL en éditant le fichier my.cnf. Pour se connecter sur un serveur distant il convient d' | + | </code> |
- | </WRAP> | + | |
- | ====Architecture==== | + | Cette option peut prendre trois valeurs : |
- | L'architecture | + | * **ON** : le serveur essaie de mettre en cache toutes les requêtes SELECT sauf celles comportant la phrase SQL_NO_CACHE, |
+ | * **OFF** : aucune requête n' | ||
+ | * **DEMAND** | ||
- | * Le serveur reçoit une requête du client, | + | ====Exclusions==== |
- | * Le serveur regarde dans le cache des requêtes, si activé, | + | |
- | * Si la requête s'y trouve, le serveur renvoie le résultat du requête stocké dans le cache, | + | |
- | * Si la requête ne s'y trouve pas, le serveur analyse et optimise la requête avant de l' | + | |
- | =====MariaDB===== | + | Seules les requêtes dites déterministes peuvent être mises en cache. Par exemple, une requête de type SELECT * FROM table donnera toujours le même résultat tant que la table n'est pas modifiée. Cette requête peut être mise dans le cache. Par contre la requête SELECT CURRENT_TIMESTAMP() est non-déterministe. Par conséquent, |
- | MariaDB est un système de gestion de base de données édité sous licence GPL. Il s'agit d'un fork communautaire de MySQL. La gouvernance du projet est assurée par la fondation MariaDB, et sa maintenance par la société Monty Program AB, créateur du projet. | + | ====Requêtes==== |
- | En 2009, à la suite du rachat de MySQL par Sun Microsystems et des annonces du rachat de Sun Microsystems par Oracle Corporation, Michael Widenius, fondateur de MySQL, quitte la société afin de lancer le projet | + | MariaDB recherche dans le cache chaque fois qu'il y a une requête SELECT. MariaDB est sensible |
- | Wikipédia annonce, fin 2012, la migration de MySQL à MariaDB8. En septembre 2013 Google annonce l' | + | * SELECT prenom,nom FROM familles, |
+ | * select prenom,nom FROM familles, | ||
+ | * SELECT nom,prenom FROM familles. | ||
- | Un consortium baptisé **Open Database Alliance** a été créé pour assurer le développement du logiciel. | + | ====Invalidations==== |
- | ====Utilisation | + | Le serveur MariaDB met à jour automatiquement le contenu |
- | Les bases de données de MariaDB, aussi appelées **Schémas** sont représentées sur disque par un répertoire du même nom que la base de données. | + | ====Effacements==== |
- | Ce répertoire existe dans un répertoire | + | Dans le cas où le cache n'est pas suffisant pour stocker une requête, MariaDB procède a un effacement |
- | Pour connaître | + | ====Fragmentation==== |
+ | |||
+ | MariaDB divise le cache en blocs mémoire d'une taille égale. Quand une requête est mise en cache, le serveur MariaDB ne connaît pas à l'avance le nombre d' | ||
+ | |||
+ | ====Paramètres==== | ||
+ | |||
+ | Les options associées avec le cache sont : | ||
+ | |||
+ | ^ Option ^ Descripton ^ | ||
+ | | query_cache_size | La taille de la mémoire dédiée au cache. La mémoire est affectée par multiples de 1 024 octets. Dans la pratique il ne faut pas dépasser les 256 Mo. | | ||
+ | | query_cache_limit | La taille maximale | ||
+ | | query_cache_type| Indique le type de cache | | ||
+ | | query_cache_min_res_unit | La taille des blocs de mémoire du cache | | ||
+ | | query_cache_wlock_invalidate | Quand cette option est **OFF**, le serveur peut renvoyer le contenu du cache même si la table est verrouillée par un autre utilisateur | | ||
+ | |||
+ | ====Verification du Cache==== | ||
+ | |||
+ | Pour consulter la configuration du cache, utilisez | ||
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +---------------+-----------------+ | + | +-------------------------+-------+ |
- | | Variable_name | Value | + | | Variable_name |
- | +---------------+-----------------+ | + | +-------------------------+-------+ |
- | | datadir | + | | Qcache_free_blocks |
- | +---------------+-----------------+ | + | | Qcache_free_memory |
+ | | Qcache_hits | ||
+ | | Qcache_inserts | ||
+ | | Qcache_lowmem_prunes | ||
+ | | Qcache_not_cached | ||
+ | | Qcache_queries_in_cache | 0 | | ||
+ | | Qcache_total_blocks | ||
+ | +-------------------------+-------+ | ||
+ | 8 rows in set (0.01 sec) | ||
+ | </code> | ||
+ | |||
+ | Cette configuration s' | ||
+ | |||
+ | ^ Option ^ Descripton ^ | ||
+ | | Qcache_free_memory | ||
+ | | Qcache_lowmem_prunes | Le nombre d' | ||
+ | | Qcache_hits | ||
+ | |||
+ | Les valeurs ci-dessus doivent être comparées avec le nombre total de requêtes de type SELECT : | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | +---------------+-------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+-------+ | ||
+ | | Com_select | ||
+ | +---------------+-------+ | ||
1 row in set (0.00 sec) | 1 row in set (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | 100 * Qcache_hits / Com_select | ||
+ | </ | ||
+ | |||
+ | Le taux d' | ||
+ | |||
+ | < | ||
+ | 100 * Qcache_inserts / Com_select | ||
+ | </ | ||
+ | |||
+ | La fragmentation peut être evaluée par le formule : | ||
+ | |||
+ | < | ||
+ | Qcache_free_blocks / Qcache_total_blocks | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : | ||
+ | Pour défragmenter le cache, il convient d' | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Optimisation du Schéma===== | ||
+ | |||
+ | L' | ||
+ | |||
+ | * Plus le type de données est petit et compact, plus il sera léger et performant, | ||
+ | * Évitez des colonnes NULL car cela demande plus de travail au serveur que des colonnes NOT NULL, | ||
+ | * Utilisez des champs adéquats aux besoins réels de la donnée à stocker, | ||
+ | * Ne surdimensionnez pas les champs de texte car MariaDB utilise la taille maximale pour effectuer des tris. Privilégiez donc des champs VARCHAR par rapport CHAR car ce dernier a une longueur fixe. | ||
+ | |||
+ | ====PROCEDURE ANALYSE==== | ||
+ | |||
+ | Afin de vous aider, MariaDB fournit une commande capable d' | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | CarnetAdresses | ||
+ | | ligue1 | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 6 rows in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Database changed | ||
+ | MariaDB [(none)]> | ||
+ | +------------------+ | ||
+ | | Tables_in_ligue1 | | ||
+ | +------------------+ | ||
+ | | equipe | ||
+ | | rencontre | ||
+ | +------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | Create Table: CREATE TABLE `equipe` ( | ||
+ | `id_equipe` int(11) NOT NULL AUTO_INCREMENT, | ||
+ | `nom` varchar(50) NOT NULL, | ||
+ | `stade` varchar(50) NOT NULL, | ||
+ | `ville` varchar(30) NOT NULL, | ||
+ | `points` int(11) NOT NULL DEFAULT ' | ||
+ | `buts` int(11) NOT NULL DEFAULT ' | ||
+ | PRIMARY KEY (`id_equipe`) | ||
+ | ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | Min_value: 1 | ||
+ | Max_value: 3 | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: 0.8165 | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 2. row *************************** | ||
+ | | ||
+ | Min_value: Debian AC | ||
+ | Max_value: Vista FC | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: NULL | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 3. row *************************** | ||
+ | | ||
+ | Min_value: Parc des Princes | ||
+ | Max_value: Yankee Stadium | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: NULL | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 4. row *************************** | ||
+ | | ||
+ | Min_value: New York | ||
+ | Max_value: Redmond | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: NULL | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 5. row *************************** | ||
+ | | ||
+ | Min_value: 0 | ||
+ | Max_value: 0 | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: 0.0000 | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 6. row *************************** | ||
+ | | ||
+ | Min_value: 0 | ||
+ | Max_value: 0 | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: 0.0000 | ||
+ | Optimal_fieldtype: | ||
+ | 6 rows in set (0.00 sec) | ||
MariaDB [(none)]> | MariaDB [(none)]> | ||
</ | </ | ||
- | L’examen | + | =====Normalisation===== |
+ | |||
+ | La normalisation d'une base de données consiste en la structuration | ||
+ | |||
+ | Les trois règles les plus importantes sont : | ||
+ | |||
+ | * Eviter | ||
+ | * Eviter l’incohérence des données, | ||
+ | * Tous les champs doivent dépendre uniquement de la clef primaire. | ||
+ | |||
+ | ====LAB #1 - Normalisation==== | ||
+ | |||
+ | Créez la base de données **connaissances** | ||
< | < | ||
- | [root@centos7 ~]# ls -l / | + | MariaDB |
- | total 28704 | + | Query OK, 1 row affected (0.00 sec) |
- | -rw-rw----. | + | MariaDB [(none)]> |
- | -rw-rw----. 1 mysql mysql 5242880 Oct 30 15:59 ib_logfile0 | + | Database changed |
- | -rw-rw----. 1 mysql mysql 5242880 Oct 30 10:09 ib_logfile1 | + | |
- | drwx------. 2 mysql mysql 4096 Oct 30 11:39 mysql | + | |
- | srwxrwxrwx. 1 mysql mysql | + | |
- | drwx------. 2 mysql mysql 4096 Oct 30 10:09 performance_schema | + | |
- | drwx------. 2 mysql mysql 6 Oct 30 11:37 test | + | |
</ | </ | ||
- | <WRAP center round important 60%> | + | Utilisez la requête suivante pour créer la table **employe** : |
- | **Important** - Il est possible de configurer MariaDB pour utiliser plusieurs supports différents pour stocker les journaux, fichiers temporaires, | + | |
- | </ | + | |
- | ====Utilisation de la Mémoire==== | + | < |
+ | CREATE TABLE employe ( | ||
+ | id int(11) NOT NULL, | ||
+ | nom varchar(30) NOT NULL DEFAULT '', | ||
+ | ville varchar(30) NOT NULL DEFAULT '', | ||
+ | savoir1 varchar(30) NOT NULL DEFAULT '', | ||
+ | niv1 tinyint(4) NOT NULL, | ||
+ | savoir2 varchar(30) NOT NULL DEFAULT '', | ||
+ | niv2 tinyint(4) NOT NULL, | ||
+ | PRIMARY KEY (id) | ||
+ | ) ENGINE=InnoDB; | ||
+ | </ | ||
- | L'allocation de la mémoire est de deux types différentes : | + | < |
+ | MariaDB [(none)]> | ||
+ | -> id int(11) NOT NULL, | ||
+ | -> nom varchar(30) NOT NULL DEFAULT | ||
+ | -> ville varchar(30) NOT NULL DEFAULT '', | ||
+ | -> savoir1 varchar(30) NOT NULL DEFAULT '', | ||
+ | -> niv1 tinyint(4) NOT NULL, | ||
+ | -> savoir2 varchar(30) NOT NULL DEFAULT '', | ||
+ | -> niv2 tinyint(4) NOT NULL, | ||
+ | -> PRIMARY KEY (id) | ||
+ | -> ) ENGINE=InnoDB; | ||
+ | Query OK, 0 rows affected (0.06 sec) | ||
- | ===Allocation par Instance=== | + | MariaDB [(none)]> |
+ | </ | ||
- | C' | + | Utilisez |
- | * le // | + | < |
- | * le // | + | INSERT INTO employe (id , nom , ville , savoir1 , niv1 , savoir2 , niv2) VALUES ('1' , ' |
- | * le // | + | </file> |
- | * le // | + | |
- | ===Allocation par Threads=== | + | < |
+ | MariaDB [(none)]> | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
- | C'est la mémoire allouée d'une manière dynamique en fonction des besoins de chaque client. Elle comprend, entre autre : | + | Query OK, 1 row affected (0.01 sec) |
- | * le // | + | Query OK, 1 row affected (0.00 sec) |
- | * le // | + | </code> |
- | * le // | + | |
- | * le // | + | |
- | ===== Installation===== | + | Vous devez obtenir le résultat suivant : |
- | ====MariaDB==== | + | < |
+ | MariaDB | ||
+ | +----+---------+---------+---------+------+---------+------+ | ||
+ | | id | nom | ville | savoir1 | niv1 | savoir2 | niv2 | | ||
+ | +----+---------+---------+---------+------+---------+------+ | ||
+ | | 1 | Alex | Londres | Linux | ||
+ | | 2 | Mathieu | Paris | Apache | ||
+ | | 3 | Thomas | ||
+ | +----+---------+---------+---------+------+---------+------+ | ||
+ | 3 rows in set (0.01 sec) | ||
- | Pour installer | + | MariaDB |
+ | </ | ||
+ | |||
+ | =====Indexes===== | ||
+ | |||
+ | Un index est une structure de données liée à une table dont le rôle est de permettre le serveur de trouver une référence au plus vite. | ||
+ | |||
+ | Un index peut être créé à la création de la table avec la clause KEY ou INDEX ou bien après sa création avec une des commandes suivantes : | ||
+ | |||
+ | CREATE INDEX nom_index ON table (colonne); | ||
+ | |||
+ | ALTER TABLE table ADD INDEX (colonne); | ||
+ | |||
+ | Ces deux commandes on des différences : | ||
+ | |||
+ | * Avec CREATE INDEX le nom de l' | ||
+ | * Avec ALTER TABLE si le nom de l' | ||
+ | * Avec ALTER TABLE il est possible de créer plusieurs index en même temps en séparant les clauses ADD INDEX par des virgules. | ||
+ | |||
+ | Pour supprimer un index on utilise une des deux commandes suivantes : | ||
+ | |||
+ | DROP INDEX nom_index | ||
+ | |||
+ | ALTER TABLE nom_index | ||
+ | |||
+ | ====Types d' | ||
+ | |||
+ | ===Index Uniques=== | ||
+ | |||
+ | Un index unique comporte une contrainte. Toutes les valeurs non NULL doivent être unique. Par contre il est possible d' | ||
< | < | ||
- | [root@centos7 ~]# yum install mariadb mariadb-server | + | MariaDB |
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | ERROR 1062 (23000): Duplicate entry ' | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 1 row affected (0.02 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +------+ | ||
+ | | id | | ||
+ | +------+ | ||
+ | | NULL | | ||
+ | | NULL | | ||
+ | | 1 | | ||
+ | +------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | ===Clef Primaires=== | ||
+ | |||
+ | Une Clef Primaire ressemble à un index unique mais possède deux différences : | ||
+ | |||
+ | * Il ne peut y avoir qu'une Clef Primaire par table, | ||
+ | * Une Clef Primaire ne peut pas contenir des valeurs NULL. | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.06 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | </ | ||
+ | |||
+ | ===Index sur Plusieurs Colonnes=== | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.33 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.11 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
+ | MariaDB | ||
+ | </ | ||
+ | |||
+ | ===Index sur un Préfixe de Colonne=== | ||
+ | |||
+ | < | ||
+ | MariaDB | ||
+ | Query OK, 0 rows affected (0.94 sec) | ||
+ | |||
+ | MariaDB | ||
+ | ERROR 1170 (42000): BLOB/TEXT column ' | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.10 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : | ||
+ | Pour les index stockant du texte, il est possible de ne créer l' | ||
</ | </ | ||
- | ====MySQL==== | + | ===Clefs Etrangères=== |
- | Téléchargez le rpm du dépôt yum : | + | Une clef étrangère indique à MariaDB de rejeter tout ajout ou modification dans la table enfant si la valeur de la clef n'a pas de correspondance dans la table parent. |
< | < | ||
- | [root@centos7 ~]# wget https:// | + | MariaDB |
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | -> ) ENGINE = InnoDB; | ||
+ | Query OK, 0 rows affected (0.32 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.31 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Installez | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | La clause CONSTRAINT est optionnelle. Le nom de la contrainte doit être unique dans toute la base. Le nom de l' | ||
+ | </ | ||
+ | |||
+ | Lors d'une suppression ou d'une mise à jour, le comportement est dicté par l' | ||
+ | |||
+ | * **RESTRICT** ou **NO ACTION** - C'est l' | ||
+ | * **CASCADE** - Quand une ligne est mise à jour ou supprimée de la table parente, la ou les lignes corrspondantes dans la table enfant sont mises à jour ou supprimées, | ||
+ | * **SET NULL** - Quand une ligne est mise à jour ou supprimée de la table parente, la ou les lignes corrspondantes dans la table enfant sont mises à NULL. | ||
+ | |||
+ | ===Index Cluster avec InnoDB=== | ||
+ | |||
+ | Le moteur InnoDB stocke les données **avec** la clef primaire. Par conséquent toute requête qui utilise la clef primaire est très efficace. Par contre toute requête qui utilise une clef secondaire est moins efficace car MariaDB recherche d' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : | ||
+ | Dans le cas où une clef primaire n' | ||
+ | </ | ||
+ | |||
+ | ===Index Couvrant=== | ||
+ | |||
+ | Dans le cas où toutes les données nécessaires à la résolution d'une requête se trouvent dans un index, on parle d'un index **couvrant**. Dans ce cas, l' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : | ||
+ | Un index peut être créé avec un de deux algorithmes principaux : B-Tree ou Hash. Un index couvrant est forcément de type B-Tree. | ||
+ | </ | ||
+ | |||
+ | ===Index FULLTEXT=== | ||
+ | |||
+ | Dans le cas où il est nécessaire de rechercher une chaîne de caractères dans un champs, on doit utiliser un index FULLTEXT | ||
< | < | ||
- | [root@centos7 ~]# rpm -ivh mysql57-community-release-el7-9.noarch.rpm | + | MariaDB |
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ERROR 1214 (HY000): The used table type doesn' | ||
</ | </ | ||
- | Maintenant installez mysql-server | + | <WRAP center round important 60%> |
+ | **Important** | ||
+ | Le moteur InnoDB supporte les index FULLTEXT à partir de la version 5.6 de MariaDB. | ||
+ | </ | ||
< | < | ||
- | [root@centos7 ~]# yum install mysql-server | + | MariaDB |
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.07 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.02 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | =====Démarrage du Serveur===== | + | Téléchargez la base de donnée exemple sakila : |
- | Le serveur MariaDB ou MySQL peut être démarré par l' | + | < |
+ | [root@centos ~]# wget http:// | ||
+ | --2014-02-01 11: | ||
+ | Résolution | ||
+ | Connexion vers downloads.mysql.com|137.254.60.14|: | ||
+ | requête HTTP transmise, en attente de la réponse...200 OK | ||
+ | Longueur: 722633 (706K) [application/ | ||
+ | Sauvegarde en : «sakila-db.tar.gz» | ||
- | ====Le Service==== | + | 100%[======================================> |
- | ===Le Service MariaDB=== | + | 2014-02-01 11:46:30 (50,6 KB/s) - «sakila-db.tar.gz» sauvegardé [722633/ |
+ | </ | ||
- | Pour activer | + | Editez |
< | < | ||
- | [root@centos7 ~]# systemctl enable mariadb | + | [root@centos7 ~]# vi ~/sakila-db/sakila-schema.sql |
- | Created symlink from /etc/systemd/ | + | |
</ | </ | ||
- | Le démarrage se fait également avec systemctl | + | Installez sakila |
< | < | ||
- | [root@centos7 | + | [root@centos |
- | [root@centos7 ~]# systemctl status mariadb | + | sakila-db/ |
- | ● mariadb.service | + | sakila-db/ |
- | | + | sakila-db/sakila.mwb |
- | Active: active (running) since Tue 2017-10-31 12:34:38 CET; 5s ago | + | sakila-db/sakila-data.sql |
- | | + | [root@centos ~]# mysql -uroot -p < sakila-db/sakila-schema.sql |
- | Process: 9737 ExecStartPre=/ | + | Enter password: |
- | Main PID: 9768 (mysqld_safe) | + | [root@centos ~]# mysql -uroot -p < sakila-db/sakila-data.sql |
- | CGroup: / | + | Enter password: |
- | | + | </code> |
- | | + | |
- | Oct 31 12:34:35 centos7.fenestros.loc systemd[1]: Starting | + | ==Mode Langage Naturel== |
- | Oct 31 12:34:35 centos7.fenestros.loc mariadb-prepare-db-dir[9737]: | + | |
- | Oct 31 12:34:36 centos7.fenestros.loc mysqld_safe[9768]: | + | L' |
- | Oct 31 12:34:36 centos7.fenestros.loc mysqld_safe[9768]: | + | |
- | Oct 31 12:34:38 centos7.fenestros.loc systemd[1]: Started MariaDB database se... | + | < |
- | Hint: Some lines were ellipsized, use -l to show in full. | + | MariaDB |
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | MariaDB | ||
+ | -> LEFT(description, | ||
+ | | ||
+ | | ||
+ | -> FROM film_text | ||
+ | -> WHERE MATCH(title, | ||
+ | -> AGAINST(' | ||
+ | -> LIMIT 5; | ||
+ | +---------+--------------------------------+-------------------+ | ||
+ | | film_id | LEFT(description, | ||
+ | +---------+--------------------------------+-------------------+ | ||
+ | | 113 | A Thrilling Yarn of a Database | 6.662790775299072 | | ||
+ | | 962 | A Fanciful Story of a Database | 6.662790775299072 | | ||
+ | | 27 | A Amazing Reflection of a Data | 6.662790775299072 | | ||
+ | | 363 | A Fast-Paced Display of a Car | 4.527374267578125 | | ||
+ | | 372 | A Taut Display of a Cat And a | 4.527374267578125 | | ||
+ | +---------+--------------------------------+-------------------+ | ||
+ | 5 rows in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Le service mariadb appel un script appelé | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Par défaut une requête FULLTEXT est une recherches en langage naturel. Ceci implique que chaque mot de la clause AGAINST est recherché dans l' | ||
+ | </ | ||
- | ===Le Service MySQL=== | + | ==Mode Booléen== |
- | Le démarrage se fait également avec systemctl | + | En utilisant le mode booléen, il vous est possible d' |
+ | |||
+ | ^ Modificateur ^ Description ^ | ||
+ | | + | Le résultat doit contenir ce mot | | ||
+ | | - | Le résultat ne doit pas contenir ce mot | | ||
+ | | ~ | La pertinence de ce mot est plus faible que les autres mots | | ||
+ | | | La pertinence de ce mot est plus haute que les autres mots | | ||
+ | | * | Placé à la fin d'une chaine, ce modificateur est un joker | | ||
+ | |||
+ | Par exemple | ||
< | < | ||
- | [root@centos7 ~]# systemctl start mysqld | + | MariaDB |
+ | film_id: 23 | ||
+ | title: ANACONDA CONFESSIONS | ||
+ | description: | ||
+ | *************************** 2. row *************************** | ||
+ | film_id: 315 | ||
+ | title: FINDING ANACONDA | ||
+ | description: | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Le service mysqld appel un script appelé | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Notez que seulement deux résultats sont retournés. En effet, il n'y a que deux enregistrements dans la base qui contiennent | ||
+ | </ | ||
- | ====Invocation Directe==== | + | ==Mode Expansion de Requête== |
- | Il est aussi possible d' | + | Dans ce mode, la recherche |
- | <file> | + | <code> |
- | # / | + | MariaDB [(none)]> |
- | </ | + | +---------+------------------------+----------------------------------------------------------------------------------------------------------------------+ |
+ | | film_id | title | description | ||
+ | +---------+------------------------+----------------------------------------------------------------------------------------------------------------------+ | ||
+ | | 428 | HOMICIDE PEACH | A Astounding Documentary of a Hunter And a Boy who must Confront a Boy in A MariaDB Convention | ||
+ | | 577 | MILE MULAN | A Lacklusture Epistle of a Cat And a Husband who must Confront a Boy in A MariaDB Convention | ||
+ | | 812 | SMOKING BARBARELLA | ||
+ | | 936 | VANISHING ROCKY | A Brilliant Reflection of a Man And a Woman who must Conquer a Pioneer in A MariaDB Convention | ||
+ | | 494 | KARATE MOON | A Astounding Yarn of a Womanizer And a Dog who must Reach a Waitress in A MariaDB Convention | ||
+ | | 608 | MURDER ANTITRUST | ||
+ | | 341 | FROST HEAD | A Amazing Reflection of a Lumberjack And a Cat who must Discover a Husband in A MariaDB Convention | ||
+ | | 773 | SEABISCUIT PUNK | A Insightful Saga of a Man And a Forensic Psychologist who must Discover a Mad Cow in A MariaDB Convention | ||
+ | | 242 | DOOM DANCING | ||
+ | | 819 | SONG HEDWIG | ||
+ | | 15 | ALIEN CENTER | ||
+ | | 137 | CHARADE DUFFEL | ||
+ | | 844 | STEERS ARMAGEDDON | ||
+ | | 119 | CAPER MOTIONS | ||
+ | | 907 | TRANSLATION SUMMER | ||
+ | | 899 | TOWERS HURRICANE | ||
+ | | 918 | TWISTED PIRATES | ||
+ | | 933 | VAMPIRE WHALE | A Epic Story of a Lumberjack And a Monkey who must Confront a Pioneer in A MariaDB Convention | ||
+ | | 716 | REAP UNFAITHFUL | ||
+ | | 727 | RESURRECTION SILVERADO | A Epic Yarn of a Robot And a Explorer who must Challenge a Girl in A MariaDB Convention | ||
+ | | 809 | SLIPPER FIDELITY | ||
+ | | 567 | MEET CHOCOLATE | ||
+ | | 129 | CAUSE DATE | A Taut Tale of a Explorer And a Pastry Chef who must Conquer a Hunter in A MariaDB Convention | ||
+ | | 261 | DUFFEL APOCALYPSE | ||
+ | | 213 | DATE SPEED | A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MariaDB Convention | ||
+ | | 11 | ALAMO VIDEOTAPE | ||
+ | | 201 | CYCLONE FAMILY | ||
+ | | 352 | GATHERING CALENDAR | ||
+ | | 398 | HANOVER GALAXY | ||
+ | | 426 | HOME PITY | A Touching Panorama of a Man And a Secret Agent who must Challenge a Teacher in A MariaDB Convention | ||
+ | | 72 | BILL OTHERS | ||
+ | | 845 | STEPMOM DREAM | A Touching Epistle of a Crocodile And a Teacher who must Build a Forensic Psychologist in A MariaDB Convention | ||
+ | | 870 | SWARM GOLD | A Insightful Panorama of a Crocodile And a Boat who must Conquer a Sumo Wrestler in A MariaDB Convention | ||
+ | | 466 | INTOLERABLE INTENTIONS | A Awe-Inspiring Story of a Monkey And a Pastry Chef who must Succumb a Womanizer in A MariaDB Convention | ||
+ | | 974 | WILD APOLLO | ||
+ | | 980 | WIZARD COLDBLOODED | ||
+ | | 551 | MAIDEN HOME | A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MariaDB Convention | ||
+ | | 987 | WORDS HUNTER | ||
+ | | 183 | CONVERSATION DOWNHILL | ||
+ | | 804 | SLEEPING SUSPECTS | ||
+ | | 576 | MIGHTY LUCK | A Astounding Epistle of a Mad Scientist And a Pioneer who must Escape a Database Administrator in A MariaDB Convention | | ||
+ | | 733 | RIVER OUTLAW | ||
+ | | 303 | FANTASY TROOPERS | ||
+ | | 937 | VARSITY TRIP | A Action-Packed Character Study of a Astronaut And a Explorer who must Reach a Monkey in A MariaDB Convention | ||
+ | | 782 | SHAKESPEARE SADDLE | ||
+ | | 114 | CAMELOT VACATION | ||
+ | | 971 | WHALE BIKINI | ||
+ | | 822 | SOUP WISDOM | ||
+ | | 107 | BUNCH MINDS | A Emotional Story of a Feminist And a Feminist who must Escape a Pastry Chef in A MariaDB Convention | ||
+ | | 750 | RUN PACIFIC | ||
+ | +---------+------------------------+----------------------------------------------------------------------------------------------------------------------+ | ||
+ | 50 rows in set (0.01 sec) | ||
- | =====Arrêt du Serveur===== | + | MariaDB [(none)]> |
+ | </ | ||
- | ====Le Service | + | < |
+ | MariaDB | ||
+ | ... | ||
+ | | 113 | CALIFORNIA BIRDS | A Thrilling Yarn of a Database Administrator And a Robot who must Battle a Database Administrator in Ancient India | | ||
+ | | 617 | NATURAL STOCK | A Fast-Paced Story of a Sumo Wrestler And a Girl who must Defeat a Car in A Baloon Factory | ||
+ | | 424 | HOLOCAUST HIGHBALL | ||
+ | | 589 | MODERN DORADO | ||
+ | | 432 | HOPE TOOTSIE | ||
+ | | 145 | CHISUM BEHAVIOR | ||
+ | | 41 | ARSENIC INDEPENDENCE | ||
+ | | 751 | RUNAWAY TENENBAUMS | ||
+ | | 962 | WASTELAND DIVINE | ||
+ | | 177 | CONNECTICUT TRAMP | A Unbelieveable Drama of a Crocodile And a Mad Cow who must Reach a Dentist in A Shark Tank | | ||
+ | | 627 | NORTH TEQUILA | ||
+ | | 702 | PULP BEVERLY | ||
+ | | 511 | LAWRENCE LOVE | A Fanciful Yarn of a Database Administrator And a Mad Cow who must Pursue a Womanizer in Berlin | ||
+ | | 376 | GRAPES FURY | A Boring Yarn of a Mad Cow And a Sumo Wrestler who must Meet a Robot in Australia | ||
+ | | 430 | HOOK CHARIOTS | ||
+ | | 267 | EAGLES PANKY | A Thoughtful Story of a Car And a Boy who must Find a A Shark in The Sahara Desert | ||
+ | | 968 | WEREWOLF LOLA | A Fanciful Story of a Man And a Sumo Wrestler who must Outrace a Student in A Monastery | ||
+ | | 692 | POTLUCK MIXED | A Beautiful Story of a Dog And a Technical Writer who must Outgun a Student in A Baloon | ||
+ | | 192 | CROSSING DIVORCE | ||
+ | | 752 | RUNNER MADIGAN | ||
+ | | 448 | IDAHO LOVE | A Fast-Paced Drama of a Student And a Crocodile who must Meet a Database Administrator in The Outback | ||
+ | | 996 | YOUNG LANGUAGE | ||
+ | +---------+-----------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | 999 rows in set (0.02 sec) | ||
- | Il est possible d' | + | MariaDB [(none)]> |
+ | </ | ||
+ | |||
+ | ==Configuration== | ||
+ | |||
+ | Une recherche FULLTEXT peut être configurée en modifiant les trois variables suivants | ||
< | < | ||
- | [root@centos7 ~]# systemctl stop mariadb | + | MariaDB |
- | [root@centos7 ~]# systemctl status mariadb | + | +-----------------+-------+ |
- | ● mariadb.service | + | | Variable_name |
- | Loaded: loaded (/ | + | +-----------------+-------+ |
- | Active: inactive (dead) since Tue 2017-10-31 12:38:12 CET; 3s ago | + | | ft_min_word_len | 4 | |
- | Process: 9769 ExecStartPost=/ | + | +-----------------+-------+ |
- | Process: 9768 ExecStart=/ | + | 1 row in set (0.00 sec) |
- | | + | |
- | Main PID: 9768 (code=exited, | + | |
- | Oct 31 12:34:35 centos7.fenestros.loc systemd[1]: Starting MariaDB database s... | + | MariaDB |
- | Oct 31 12:34:35 centos7.fenestros.loc mariadb-prepare-db-dir[9737]: Database ... | + | +-----------------+-------+ |
- | Oct 31 12:34:36 centos7.fenestros.loc mysqld_safe[9768]: | + | | Variable_name |
- | Oct 31 12:34:36 centos7.fenestros.loc mysqld_safe[9768]: | + | +-----------------+-------+ |
- | Oct 31 12:34:38 centos7.fenestros.loc systemd[1]: Started MariaDB database se... | + | | ft_max_word_len | 84 | |
- | Oct 31 12:38:09 centos7.fenestros.loc systemd[1]: Stopping MariaDB database s... | + | +-----------------+-------+ |
- | Oct 31 12:38:12 centos7.fenestros.loc systemd[1]: Stopped MariaDB database se... | + | 1 row in set (0.00 sec) |
- | Hint: Some lines were ellipsized, use -l to show in full. | + | |
- | [root@centos7 ~]# systemctl start mariadb | + | |
- | [root@centos7 ~]# systemctl status mariadb | + | |
- | ● mariadb.service | + | |
- | Loaded: loaded (/ | + | |
- | Active: active (running) since Tue 2017-10-31 12:38:25 CET; 1s ago | + | |
- | Process: 11254 ExecStartPost=/ | + | |
- | Process: 11222 ExecStartPre=/ | + | |
- | Main PID: 11253 (mysqld_safe) | + | |
- | CGroup: / | + | |
- | | + | |
- | | + | |
- | Oct 31 12:38:22 centos7.fenestros.loc systemd[1]: Starting | + | MariaDB [(none)]> SHOW VARIABLES LIKE ' |
- | Oct 31 12:38:23 centos7.fenestros.loc mariadb-prepare-db-dir[11222]: Database... | + | Empty set (0.00 sec) |
- | Oct 31 12:38:23 centos7.fenestros.loc mysqld_safe[11253]: | + | |
- | Oct 31 12:38:23 centos7.fenestros.loc mysqld_safe[11253]: | + | MariaDB |
- | Oct 31 12:38:25 centos7.fenestros.loc systemd[1]: Started MariaDB database se... | + | |
- | Hint: Some lines were ellipsized, use -l to show in full. | + | |
</ | </ | ||
- | ====La Commande | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | La dernière variable peut contenir une liste de mots qui ne seront pas indexés. Notez que chaque fois que vous modifiez une des ces variables, il est nécessaire de reconstruire l' | ||
+ | </ | ||
+ | |||
+ | ==Limitations== | ||
+ | |||
+ | Veuillez garder en tête les points suivants : | ||
+ | |||
+ | * Pour effectuer une recherche FULLTEXT, il **faut** utiliser MATCH AGAINST, | ||
+ | * Dès que vous utilisez MATCH AGAINST, le serveur utilisera une recherche FULLTEXT même si l' | ||
+ | * Les résultats en mode langage naturel sont triés par la pertinence. Ceci n'est **pas** le cas pour les deux autres modes, | ||
+ | * Un index FULLTEXT ne peut **pas** être utilisé comme index couvrant. | ||
+ | |||
+ | =====La Commande | ||
- | La comande **mysqladmin** peut aussi être utilisée pour arrêter | + | La commande EXPLAIN est utilisée pour voir le plan d'exécution de la requête choisi par l'optimiseur |
< | < | ||
- | [root@centos7 ~]# / | + | MariaDB |
- | Enter password: | + | *************************** 1. row *************************** |
- | [root@centos7 ~]# systemctl status mariadb | + | id: 1 |
- | ● mariadb.service - MariaDB database server | + | select_type: SIMPLE |
- | Loaded: loaded (/ | + | table: film_text |
- | Active: inactive (dead) since Tue 2017-10-31 12:53:09 CET; 4s ago | + | type: fulltext |
- | | + | possible_keys: idx_title_description |
- | | + | key: idx_title_description |
- | | + | |
- | Main PID: 11253 (code=exited, | + | ref: |
+ | rows: 1 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
- | Oct 31 12:38:22 centos7.fenestros.loc systemd[1]: Starting | + | MariaDB [(none)]> |
- | Oct 31 12:38:23 centos7.fenestros.loc mariadb-prepare-db-dir[11222]: Database... | + | |
- | Oct 31 12:38:23 centos7.fenestros.loc mysqld_safe[11253]: | + | |
- | Oct 31 12:38:23 centos7.fenestros.loc mysqld_safe[11253]: | + | |
- | Oct 31 12:38:25 centos7.fenestros.loc systemd[1]: Started MariaDB database se... | + | |
- | Hint: Some lines were ellipsized, use -l to show in full. | + | |
</ | </ | ||
+ | |||
+ | La sortie de la commande démontre 10 colonnes dont les plus importantes sont **type**, **possible_keys**, | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
+ | Pour l'explication des autres colonnes, voir **[[http:// | ||
</ | </ | ||
- | =====Configuration===== | + | ====La Colonne type==== |
- | Votre première prise en mains de %%MariaDB%% doit débuter par la commande **mysql** | + | Cette colonne montre comment l' |
- | ====Le Client MySQL==== | + | ===ALL=== |
- | ===Utilisation=== | + | Un parcours complet de la table est nécessaire car il n'y a pas d' |
- | MariaDB | + | < |
+ | MariaDB | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: film_text | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 1000 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
- | Pour démarrer une connexion au serveur | + | MariaDB |
+ | </ | ||
- | Les paramètres les plus courants sont : | + | < |
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | film_id: 886 | ||
+ | title: THEORY MERMAID | ||
+ | description: | ||
+ | 1 row in set (0.00 sec) | ||
- | $ mysql –u root –p Databasename | + | MariaDB |
+ | </ | ||
- | Où : | + | ===index=== |
- | * **-u** | + | Un parcours complet d'un index est necéssaire : |
- | * donne le nom de l’utilisateur. Si vous renoncez à l’option –u , le nom de login sera utilisé sous Unix/Linux et le nom ODBC sous Windows. | + | |
- | | + | < |
- | | + | MariaDB [(none)]> |
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: category | ||
+ | type: index | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 1 | ||
+ | ref: NULL | ||
+ | rows: 16 | ||
+ | Extra: Using index | ||
+ | 1 row in set (0.01 sec) | ||
- | * **-h** | + | MariaDB |
- | * permet de préciser le nom de l’hôte qui héberge | + | </code> |
- | | + | < |
- | * cette option permet de spécifier le protocole de communication à utiliser. Il est rarement nécessaire d’indiquer cette option, puisque MariaDB choisit le bon protocole par défaut. Lorsque le client mysql et le serveur MariaDB ne tournent pas sur le même ordinateur, le seul protocole réseau possible est le **TCP**, dans ce cas n’oubliez pas de préciser le paramètre –h. | + | MariaDB [(none)]> |
+ | *************************** 1. row *************************** | ||
+ | category_id: | ||
+ | *************************** 2. row *************************** | ||
+ | category_id: | ||
+ | *************************** 3. row *************************** | ||
+ | category_id: | ||
+ | *************************** 4. row *************************** | ||
+ | category_id: | ||
+ | *************************** 5. row *************************** | ||
+ | category_id: | ||
+ | *************************** 6. row *************************** | ||
+ | category_id: | ||
+ | *************************** 7. row *************************** | ||
+ | category_id: | ||
+ | *************************** 8. row *************************** | ||
+ | category_id: | ||
+ | *************************** 9. row *************************** | ||
+ | category_id: | ||
+ | *************************** 10. row *************************** | ||
+ | category_id: | ||
+ | *************************** 11. row *************************** | ||
+ | category_id: | ||
+ | *************************** 12. row *************************** | ||
+ | category_id: | ||
+ | *************************** 13. row *************************** | ||
+ | category_id: | ||
+ | *************************** 14. row *************************** | ||
+ | category_id: | ||
+ | *************************** 15. row *************************** | ||
+ | category_id: | ||
+ | *************************** 16. row *************************** | ||
+ | category_id: | ||
+ | 16 rows in set (0.00 sec) | ||
- | * **-P n** | + | MariaDB |
- | * permet de préciser le port de communication utilisée pour se connecter à MariaDB. Cette option est effective que lorsque la communication passe par TCP/IP. | + | </code> |
- | * **- -default-character-set | + | ===range=== |
- | * cette option indique le jeu de caractères utilisés dans le cadre de communication entre mysql et le serveur MariaDB. En théorie, il s’agit du même jeu de caractères que celui utilisé par défaut dans la vie de commandes sous Windows ou la console sous Linux. Les jeux de caractères pris en charge par MariaDB sont notamment Latin 1 (ISO-8559-1), | + | |
- | * Databasename | + | Un parcours |
- | * ce dernier paramètre indique à MariaDB le nom d’une base de données, ce qui permet de l’utiliser directement dès l’ouverture de MariaDB. Si vous désirez changer ici de base de données après sa connexion vous pouvez utiliser la commande SQL **USE < | + | |
- | Exemple | + | < |
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: category | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 1 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
- | $ mysql -u root -p -h server --protocol=tcp | + | MariaDB |
- | $ Password : ********** [Entrée] | + | </ |
- | ===Options=== | + | < |
+ | MariaDB [(none)]> | ||
+ | Empty set (0.01 sec) | ||
- | Dans la console | + | MariaDB |
+ | </ | ||
- | ^ Abréviation ^ Commande ^ Signification ^ | + | ===index_merge=== |
- | | \c | clear | Annule une commande en cours de saisie | | + | |
- | | \h | help | Affiche la liste des commandes | | + | |
- | | \q | exit ou quit | Ferme la connexion à MariaDB. Sous Unix/Linux, il est possible utilisé le raccourci ctrl+D | | + | |
- | | \s | status | Affiche les informations de statut du serveur MariaDB | | + | |
- | | \T[f] | tee[filename] | Enregistre tous ce qui apparaît dans la fenêtre de commandes dans le fichier indiqué | | + | |
- | | L | notee | Ferme tee. Le protocole doit être repris à tout instant avec tee ou \T. Il n’est pas nécessaire de saisir de nouveau le nom de fichier. | | + | |
- | | \u db | use database | La base de données saisie devient la base de données par défaut | | + | |
- | | \. Fn | source file name | exécute les commandes SQL contenues dans le fichier spécifié. Les commandes doivent à séparer par des pointsvirgules. | | + | |
- | NB : la fonction \c n’a aucun effet dans les chaînes de caractères( "" | + | Plusieurs index sont utilisés simultanément |
- | Notez aussi que MariaDB | + | < |
+ | MariaDB | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: index_merge | ||
+ | possible_keys: | ||
+ | key: idx_fk_inventory_id, | ||
+ | key_len: 3,4 | ||
+ | ref: NULL | ||
+ | rows: 8557 | ||
+ | Extra: Using sort_union(idx_fk_inventory_id, | ||
+ | 1 row in set (0.01 sec) | ||
- | ====LAB #1 - Configuration de Base==== | + | MariaDB [(none)]> |
+ | </ | ||
- | Saisissez donc la commande | + | < |
+ | MariaDB [(none)]> | ||
+ | ... | ||
+ | *************************** 13776. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 1 | ||
+ | | ||
+ | *************************** 13777. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 1 | ||
+ | | ||
+ | *************************** 13778. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 1 | ||
+ | | ||
+ | *************************** 13779. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 2 | ||
+ | | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ===ref=== | ||
+ | |||
+ | Un index non unique est examiné. Plusieurs lignes peuvent être retournées | ||
< | < | ||
- | [root@centos7 ~]# systemctl start mariadb | + | MariaDB |
- | [root@centos7 ~]# mysql | + | *************************** 1. row *************************** |
- | Welcome to the MariaDB monitor. | + | id: 1 |
- | Your MariaDB connection | + | select_type: |
- | Server version: 5.5.56-MariaDB MariaDB Server | + | table: customer |
+ | type: const | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: const | ||
+ | rows: 1 | ||
+ | Extra: Using index | ||
+ | *************************** 2. row *************************** | ||
+ | | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ref | ||
+ | possible_keys: | ||
+ | key: idx_fk_customer_id | ||
+ | key_len: | ||
+ | ref: const | ||
+ | rows: 32 | ||
+ | Extra: | ||
+ | 2 rows in set (0.01 sec) | ||
- | Copyright | + | MariaDB [(none)]> |
+ | </ | ||
- | Type ' | + | < |
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 2. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 3. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 4. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 5. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 6. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 7. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 8. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 9. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 10. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 11. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 12. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 13. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 14. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 15. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 16. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 17. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 18. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 19. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 20. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 21. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 22. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 23. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 24. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 25. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 26. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 27. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 28. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 29. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 30. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 31. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 32. row *************************** | ||
+ | rental_date: | ||
+ | 32 rows in set (0.00 sec) | ||
MariaDB [(none)]> | MariaDB [(none)]> | ||
</ | </ | ||
- | pour visualiser la liste des bases de données par défaut | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Il existe une variante | ||
+ | </ | ||
+ | |||
+ | ===eq_ref=== | ||
+ | |||
+ | Un index unique ou une clé primaire est examiné | ||
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +--------------------+ | + | *************************** 1. row *************************** |
- | | Database | + | id: 1 |
- | +--------------------+ | + | |
- | | information_schema | | + | |
- | | mysql | | + | type: range |
- | | performance_schema | | + | possible_keys: |
- | | test | | + | key: rental_date |
- | +--------------------+ | + | |
- | 7 rows in set (0.01 sec) | + | ref: NULL |
+ | rows: 1 | ||
+ | Extra: Using where; Using index | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: eq_ref | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: sakila.rental.customer_id | ||
+ | rows: 1 | ||
+ | Extra: | ||
+ | 2 rows in set (0.00 sec) | ||
MariaDB [(none)]> | MariaDB [(none)]> | ||
</ | </ | ||
- | Ensuite changez | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Ce type est le meilleur t(ype d' | ||
+ | </ | ||
+ | |||
+ | ===Cas Spécifiques=== | ||
+ | |||
+ | ==const== | ||
+ | |||
+ | Une seule ligne a besoin d' | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: category | ||
+ | type: const | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 1 | ||
+ | ref: const | ||
+ | rows: 1 | ||
+ | Extra: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | category_id: | ||
+ | name: Action | ||
+ | last_update: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | ==System== | ||
+ | |||
+ | Identique au type précédent dans le cas où la table est une table à une seule ligne. | ||
+ | |||
+ | ==NULL== | ||
+ | |||
+ | Aucun parcours | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: NULL | ||
+ | type: NULL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: NULL | ||
+ | Extra: Select tables optimized away | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | COUNT(*): 1000 | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | ====Les Colonnes possible_keys, | ||
+ | |||
+ | La colonne **possible_keys** contient l' | ||
+ | |||
+ | Une valeur NULL dans la colonne **possible_keys** indique qu'il n' | ||
+ | |||
+ | La colonne **key_len** indique la taille en octets de l' | ||
+ | |||
+ | Téléchargez la base de données | ||
+ | |||
+ | < | ||
+ | [root@centos ~]# wget https:// | ||
+ | </ | ||
+ | |||
+ | Installez | ||
+ | |||
+ | < | ||
+ | [root@centos ~]# mysql -uroot -p | ||
+ | Enter password: | ||
+ | Welcome to the MariaDB monitor. | ||
+ | Your MariaDB connection id is 8 | ||
+ | Server version: 5.5.33-cll-lve MariaDB Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Bye | ||
+ | [root@centos ~]# gunzip world-db.tar.gz | ||
+ | [root@centos ~]# mysql -uroot -p world < world-db/ | ||
+ | Enter password: | ||
+ | [root@centos ~]# | ||
+ | </ | ||
+ | |||
+ | Voyons un exemple maintenant avec cette base de données | ||
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
Reading table information for completion of table and column names | Reading table information for completion of table and column names | ||
You can turn off this feature to get a quicker startup with -A | You can turn off this feature to get a quicker startup with -A | ||
Database changed | Database changed | ||
- | MariaDB [mysql]> | + | MariaDB [(none)]> ALTER TABLE City ADD INDEX idx_name_district(Name, |
+ | Query OK, 4079 rows affected (0.11 sec) | ||
+ | Records: 4079 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: idx_name_district | ||
+ | key_len: 35 | ||
+ | ref: NULL | ||
+ | rows: 141 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Afin de consulter les tables présentes dans la base, utilisez | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Notez que la taille de l' | ||
+ | </ | ||
+ | |||
+ | ====La Colonne rows==== | ||
+ | |||
+ | La colonne **rows** contient une estimation du nombre de lignes que le moteur doit parcourir avant de pouvoir retourner un résultat de la requête | ||
< | < | ||
- | MariaDB [mysql]> SHOW TABLES; | + | MariaDB [(none)]> EXPLAIN SELECT * FROM City CROSS JOIN Country\G |
- | +---------------------------+ | + | *************************** 1. row *************************** |
- | | Tables_in_mysql | + | id: 1 |
- | +---------------------------+ | + | |
- | | columns_priv | + | |
- | | db | | + | type: ALL |
- | | event | | + | possible_keys: |
- | | func | | + | key: NULL |
- | | general_log | + | |
- | | help_category | + | |
- | | help_keyword | + | rows: 239 |
- | | help_relation | + | |
- | | help_topic | + | *************************** 2. row *************************** |
- | | host | | + | id: 1 |
- | | ndb_binlog_index | + | |
- | | plugin | + | |
- | | proc | | + | type: ALL |
- | | procs_priv | + | possible_keys: |
- | | proxies_priv | + | key: NULL |
- | | servers | + | |
- | | slow_log | + | ref: NULL |
- | | tables_priv | + | rows: 4079 |
- | | time_zone | + | |
- | | time_zone_leap_second | + | 2 rows in set (0.00 sec) |
- | | time_zone_name | + | |
- | | time_zone_transition | + | |
- | | time_zone_transition_type | | + | |
- | | user | | + | |
- | +---------------------------+ | + | |
- | 24 rows in set (0.00 sec) | + | |
- | MariaDB [mysql]> | + | MariaDB [(none)]> |
</ | </ | ||
- | Pour consulter une table spécifique, | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Dans l' | ||
+ | </ | ||
+ | |||
+ | Pour prouver qu'il s'agit bien d'une estimation, saisissez la requête suivante | ||
< | < | ||
- | MariaDB [mysql]> DESCRIBE user; | + | MariaDB [(none)]> EXPLAIN SELECT * FROM City WHERE Name LIKE 'San%'\G |
- | +------------------------+-----------------------------------+------+-----+---------+-------+ | + | *************************** 1. row *************************** |
- | | Field | Type | Null | Key | Default | Extra | | + | id: 1 |
- | +------------------------+-----------------------------------+------+-----+---------+-------+ | + | |
- | | Host | char(60) | + | |
- | | User | char(16) | + | type: range |
- | | Password | + | possible_keys: |
- | | Select_priv | + | key: idx_name_district |
- | | Insert_priv | + | |
- | | Update_priv | + | ref: NULL |
- | | Delete_priv | + | rows: 141 |
- | | Create_priv | + | |
- | | Drop_priv | + | 1 row in set (0.05 sec) |
- | | Reload_priv | + | |
- | | Shutdown_priv | + | |
- | | Process_priv | + | |
- | | File_priv | + | |
- | | Grant_priv | + | |
- | | References_priv | + | |
- | | Index_priv | + | |
- | | Alter_priv | + | |
- | | Show_db_priv | + | |
- | | Super_priv | + | |
- | | Create_tmp_table_priv | + | |
- | | Lock_tables_priv | + | |
- | | Execute_priv | + | |
- | | Repl_slave_priv | + | |
- | | Repl_client_priv | + | |
- | | Create_view_priv | + | |
- | | Show_view_priv | + | |
- | | Create_routine_priv | + | |
- | | Alter_routine_priv | + | |
- | | Create_user_priv | + | |
- | | Event_priv | + | |
- | | Trigger_priv | + | |
- | | Create_tablespace_priv | enum(' | + | |
- | | ssl_type | + | |
- | | ssl_cipher | + | |
- | | x509_issuer | + | |
- | | x509_subject | + | |
- | | max_questions | + | |
- | | max_updates | + | |
- | | max_connections | + | |
- | | max_user_connections | + | |
- | | plugin | + | |
- | | authentication_string | + | |
- | +------------------------+-----------------------------------+------+-----+---------+-------+ | + | |
- | 42 rows in set (0.00 sec) | + | |
- | MariaDB [mysql]> | + | MariaDB [(none)]> SELECT COUNT(*) FROM City WHERE Name LIKE ' |
+ | *************************** 1. row *************************** | ||
+ | COUNT(*): 110 | ||
+ | 1 row in set (0.02 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Pour visualiser la liste des utilisateurs autorisés pour %%MariaDB%%, | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Si vous vous rendez compte que les estimations sont largement erronées vous pouvez | ||
+ | </ | ||
- | < | + | ====La Colonne extra==== |
- | MariaDB [mysql]> SELECT host, user, password FROM user; | + | |
- | +-----------------------+-------+-----------+ | + | |
- | | host | user | password | + | |
- | +-----------------------+-------+-----------+ | + | |
- | | localhost | + | |
- | | centos7.fenestros.loc | root | | | + | |
- | | 127.0.0.1 | + | |
- | | ::1 | root | | | + | |
- | +-----------------------+-------+-----------+ | + | |
- | 7 rows in set (0.00 sec) | + | |
- | MariaDB [mysql]> | + | La colonne extra donne des informations supplémentaires concernant la requête : |
- | </ | + | |
- | Vous noterez que l' | + | * **Using where** - visible quand le serveur |
+ | * **Using index** - le serveur va utiliser un index couvrant, | ||
+ | * **Using temporary** - le serveur va utiliser une table temporaire pour effectuer un tri, | ||
+ | * **Using filesort** - le serveur doit trier les résultats | ||
- | Il faut par conséquence en définir un en urgence ! | + | =====La Commande EXPLAIN EXTENDED===== |
- | Pour sortir de l' | + | La commande **EXPLAIN EXTENDED** est disponible dans MariaDB |
< | < | ||
- | MariaDB [mysql]> exit | + | MariaDB [(none)]> EXPLAIN EXTENDED SELECT ID FROM City WHERE ID < 50\G |
- | Bye | + | *************************** 1. row *************************** |
- | [root@centos7 ~]# | + | id: 1 |
+ | select_type: | ||
+ | table: City | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 4 | ||
+ | ref: NULL | ||
+ | rows: 50 | ||
+ | | ||
+ | Extra: Using where; Using index | ||
+ | 1 row in set, 1 warning (0.00 sec) | ||
+ | |||
+ | MariaDB | ||
+ | *************************** 1. row *************************** | ||
+ | COUNT(ID): 49 | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Pour définir le mot de passe **fenestros** pour root, il convient de saisir la commande suivante | + | Par contre cette valeur n'est qu'une estimation |
< | < | ||
- | [root@centos7 ~]# mysqladmin -u root password fenestros | + | MariaDB |
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 4079 | ||
+ | | ||
+ | Extra: Using where | ||
+ | 1 row in set, 1 warning (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | Name: Besançon | ||
+ | 1 row in set (0.07 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Lors de la prochaine tentative | + | Malgré le peu de fiabilité dans le résultat |
< | < | ||
- | [root@centos7 ~]# mysql -u root | + | MariaDB |
- | ERROR 1045 (28000): Access denied for user ' | + | *************************** 1. row *************************** |
+ | id: 1 | ||
+ | select_type: | ||
+ | table: NULL | ||
+ | type: NULL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: NULL | ||
+ | | ||
+ | Extra: Select tables optimized away | ||
+ | 1 row in set, 1 warning | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | Level: Note | ||
+ | Code: 1003 | ||
+ | Message: select count(0) AS `COUNT(*)` from `world`.`Country` | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Pour vous connecter en tant que l'administrateur de la base il faut maintenant utiliser la commande suivante | + | =====Optimisation des Requêtes===== |
+ | |||
+ | ====Isolation des Colonnes==== | ||
+ | |||
+ | L' | ||
< | < | ||
- | [root@centos7 ~]# mysql -u root -p mysql | + | MariaDB |
- | Enter password: fenestros | + | |
Reading table information for completion of table and column names | Reading table information for completion of table and column names | ||
You can turn off this feature to get a quicker startup with -A | You can turn off this feature to get a quicker startup with -A | ||
- | Welcome to the MariaDB | + | Database changed |
- | Your MariaDB connection | + | MariaDB |
- | Server version: 5.5.56-MariaDB MariaDB Server | + | *************************** 1. row *************************** |
+ | | ||
+ | | ||
+ | table: rental | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 15629 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
- | Copyright | + | MariaDB [(none)]> EXPLAIN SELECT * FROM rental WHERE rental_date > CURRENT_DATE() + INTERVAL 10 DAY\G |
- | + | *************************** 1. row *************************** | |
- | Type ' | + | id: 1 |
+ | | ||
+ | table: rental | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: rental_date | ||
+ | key_len: 8 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
- | MariaDB [mysql]> | + | MariaDB [(none)]> |
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
+ | La réécriture | ||
</ | </ | ||
- | Saisissez | + | ====Jointures==== |
+ | |||
+ | Quand MariaDB effectue des jointures il le fait une à une et successivement. Par exemple, dans le cas de 4 tables, table1, table2, table3, table4, | ||
+ | |||
+ | Dans le cas d'un INNER JOIN, MariaDB peut décider de ne pas respecter cet ordre : | ||
< | < | ||
- | MariaDB [mysql]> SELECT | + | MariaDB [(none)]> EXPLAIN |
- | +-----------------------+-------+-------------------------------------------+ | + | *************************** 1. row *************************** |
- | | host | user | password | + | id: 1 |
- | +-----------------------+-------+-------------------------------------------+ | + | |
- | | localhost | + | |
- | | centos7.fenestros.loc | root | | | + | type: range |
- | | 127.0.0.1 | root | | | + | possible_keys: |
- | | ::1 | root | | | + | key: rental_date |
- | +-----------------------+-------+-------------------------------------------+ | + | key_len: 8 |
- | 7 rows in set (0.00 sec) | + | ref: NULL |
+ | rows: 1 | ||
+ | Extra: Using where; Using index | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: eq_ref | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: sakila.rental.customer_id | ||
+ | rows: 1 | ||
+ | | ||
+ | 2 rows in set (0.01 sec) | ||
- | MariaDB [mysql]> | + | MariaDB [(none)]> |
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
+ | L' | ||
</ | </ | ||
- | ====LAB #2 - Configuration Avancée==== | + | Pourquoi l' |
- | La configuration avancée du serveur | + | < |
+ | MariaDB | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 577 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: rental_date | ||
+ | key_len: 8 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where; Using index; Using join buffer | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | Dans le cas ci-dessus, l' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : | ||
+ | Pour les jointure externes, LEFT JOIN et RIGHT JOIN, l' | ||
+ | </ | ||
+ | |||
+ | ====Indexes==== | ||
- | * en éditant le fichier **/ | + | ===USE INDEX=== |
- | * en passant des paramètres à l' | + | |
- | * en paramétrant le serveur dynamiquement. | + | |
- | ===Le fichier my.cnf=== | + | Il est possible d' |
< | < | ||
- | [root@centos7 ~]# cat /etc/my.cnf | + | MariaDB |
- | [mysqld] | + | *************************** 1. row *************************** |
- | datadir=/ | + | id: 1 |
- | socket=/ | + | |
- | # Disabling symbolic-links is recommended to prevent assorted security risks | + | table: customer |
- | symbolic-links=0 | + | type: ALL |
- | # Settings user and group are ignored when systemd is used. | + | possible_keys: |
- | # If you need to run mysqld under a different user or group, | + | key: NULL |
- | # customize your systemd unit file for mariadb according to the | + | key_len: NULL |
- | # instructions | + | ref: NULL |
+ | rows: 577 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | | ||
+ | | ||
+ | type: ref | ||
+ | possible_keys: | ||
+ | key: idx_fk_customer_id | ||
+ | key_len: 2 | ||
+ | ref: sakila.customer.customer_id | ||
+ | rows: 13 | ||
+ | | ||
+ | 2 rows in set (0.00 sec) | ||
+ | </code> | ||
- | [mysqld_safe] | + | <WRAP center round important 60%> |
- | log-error=/ | + | **Important** : |
- | pid-file=/var/ | + | Dans le cas d' |
+ | </WRAP> | ||
- | # | + | ===FORCE INDEX=== |
- | # include all files from the config directory | + | |
- | # | + | < |
- | !includedir /etc/my.cnf.d | + | MariaDB [(none)]> |
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 577 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ref | ||
+ | possible_keys: | ||
+ | key: idx_fk_customer_id | ||
+ | key_len: 2 | ||
+ | ref: sakila.customer.customer_id | ||
+ | rows: 13 | ||
+ | Extra: Using where | ||
+ | 2 rows in set (0.01 sec) | ||
</ | </ | ||
- | Ce fichier n'est pas cependant le seul endroit où est configuré le serveur. En effet, le serveur lit des directives des fichiers | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Dans le cas d' | ||
+ | </WRAP> | ||
+ | |||
+ | ===IGNORE INDEX=== | ||
< | < | ||
- | [root@centos7 ~]# / | + | MariaDB |
- | 171031 13:10:57 [Note] Plugin ' | + | *************************** 1. row *************************** |
- | / | + | id: 1 |
- | | + | select_type: SIMPLE |
- | my.cnf files | + | table: rental |
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 15629 | ||
+ | Extra: Using where | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: eq_ref | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: sakila.rental.customer_id | ||
+ | rows: 1 | ||
+ | | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : En cas de duplicité de directives, c'est la dernière lue qui l'emporte. Si vous avez un autre fichier | + | **Important** : |
+ | Dans le cas d' | ||
</ | </ | ||
- | Le fichier my.cnf est organisé en sections, aussi appelées des groupes. Ces sections font référence au programme concerné par la configuration. Par exemple la section **[mysqld]** fait référence au serveur, tandis qu'une section [mysql] ferait référence au client en mode texte. Il est aussi possible de trouver les sections suivantes : | + | ====CLAUSES LENTES==== |
- | * [mysqldump], | + | Les clauses d’agrégation telles SUM(), MAX() et MIN() provoquent en générale des requêtes lentes car il faut lire l' |
- | | + | |
- | * [mysqlhotcopy], | + | < |
- | * [myisamchk], | + | MariaDB |
- | | + | *************************** 1. row *************************** |
- | * etc. | + | Name: film_text |
+ | | ||
+ | Version: 10 | ||
+ | | ||
+ | Rows: 1000 | ||
+ | | ||
+ | Data_length: | ||
+ | Max_data_length: | ||
+ | | ||
+ | Data_free: 0 | ||
+ | | ||
+ | Create_time: | ||
+ | Update_time: | ||
+ | | ||
+ | Collation: utf8_general_ci | ||
+ | | ||
+ | | ||
+ | Comment: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | | ||
+ | table: NULL | ||
+ | type: NULL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: NULL | ||
+ | Extra: Select tables optimized away | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | MariaDB | ||
+ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** - [client] est une section qui configure | + | **Important** |
+ | Dans le cas ci-dessus la valeur de la colonne | ||
</ | </ | ||
- | Le fichier de configuration peut aussi contenir | + | ====Sous-requêtes==== |
+ | |||
+ | MariaDB exécute parfois très lentement | ||
< | < | ||
- | [root@centos7 ~]# ls -l / | + | MariaDB |
- | total 12 | + | Reading table information for completion of table and column names |
- | -rw-r--r--. 1 root root 295 Apr 30 2017 client.cnf | + | You can turn off this feature to get a quicker startup with -A |
- | -rw-r--r--. 1 root root 232 Apr 30 2017 mysql-clients.cnf | + | |
- | -rw-r--r--. 1 root root 744 Apr 30 2017 server.cnf | + | Database changed |
+ | MariaDB [(none)]> | ||
+ | +------------+ | ||
+ | | Language | ||
+ | +------------+ | ||
+ | | Arabic | ||
+ | | French | ||
+ | | Italian | ||
+ | | Portuguese | | ||
+ | | Spanish | ||
+ | | Turkish | ||
+ | +------------+ | ||
+ | 6 rows in set (0.03 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +------------+ | ||
+ | | Language | ||
+ | +------------+ | ||
+ | | Arabic | ||
+ | | French | ||
+ | | Italian | ||
+ | | Portuguese | | ||
+ | | Spanish | ||
+ | | Turkish | ||
+ | +------------+ | ||
+ | 6 rows in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
+ | |||
+ | ====Moteurs==== | ||
+ | |||
+ | ===MyISAM=== | ||
+ | |||
+ | Le paramètre le plus important pour le moteur MyISAM est le key_buffer_size : | ||
< | < | ||
- | [root@centos7 ~]# ls -l / | + | MariaDB |
- | total 12 | + | +-----------------+---------+ |
- | -rw-r--r--. 1 root root 295 Apr 30 2017 client.cnf | + | | Variable_name |
- | -rw-r--r--. 1 root root 232 Apr 30 2017 mysql-clients.cnf | + | +-----------------+---------+ |
- | -rw-r--r--. 1 root root 744 Apr 30 2017 server.cnf | + | | key_buffer_size | 8388608 | |
- | [root@centos7 ~]# cat / | + | +-----------------+---------+ |
- | # | + | 1 row in set (0.00 sec) |
- | # These two groups are read by the client library | + | |
- | # Use it for options that affect all clients, but not the server | + | |
- | # | + | |
+ | MariaDB [(none)]> | ||
+ | +------------------------+-------+ | ||
+ | | Variable_name | ||
+ | +------------------------+-------+ | ||
+ | | Key_blocks_not_flushed | 0 | | ||
+ | | Key_blocks_unused | ||
+ | | Key_blocks_used | ||
+ | | Key_read_requests | ||
+ | | Key_reads | ||
+ | | Key_write_requests | ||
+ | | Key_writes | ||
+ | +------------------------+-------+ | ||
+ | 7 rows in set (0.01 sec) | ||
- | [client] | + | MariaDB |
+ | </ | ||
- | # This group is not read by mysql client library, | + | <WRAP center round important 60%> |
- | # If you use the same .cnf file for MySQL and MariaDB, | + | **Important** : |
- | # use it for MariaDB-only client options | + | La variable **Key_reads** indique le nombre de requêtes de lectures qui n'ont pas pu être satisfaites par le cache. La variable **Key_read_requests** indique le nombre de lectures totale. La formule (1 - Key_reads / Key_read_requests ) * 100 donne une indication de l' |
- | [client-mariadb] | + | </ |
- | [root@centos7 ~]# cat / | + | ===InnoDB== |
- | # | + | |
- | # These groups are read by MariaDB command-line tools | + | |
- | # Use it for options that affect only one utility | + | |
- | # | + | |
- | [mysql] | + | Les paramètres les plus importants pour le moteur **InnoDB** sont résumés dans la table suivante : |
- | [mysql_upgrade] | + | ^ Paramètre ^ Valeur Suggérée ^ |
+ | | innodb_buffer_pool_size | 80% de la mémoire physique de la machine | | ||
+ | | innodb_flush_log_at_trx_commit | 1 si la protection des données est primordiale, | ||
- | [mysqladmin] | ||
- | [mysqlbinlog] | + | =====Partitionnement===== |
- | [mysqlcheck] | + | Le partitionnement est utilisé pour diviser les données d'une table en parties logiques selon une règle pré-établie : |
- | [mysqldump] | + | * Par les données contenues dans la table. Dans ce cas on parle de partitionnement **horizontal**. Il existe 4 types possibles : |
+ | * **Par plages**, | ||
+ | * **Par listes**, | ||
+ | * **Par hachage**, | ||
+ | * **Par clef**, | ||
+ | * Par les colonnes de la table. | ||
- | [mysqlimport] | ||
- | [mysqlshow] | + | <WRAP center round important 60%> |
+ | **Important** : | ||
+ | Il est possible de faire un partitionnement vertical et un partitionnement horizontal sur la même table. Il est aussi possible de faire des partitions de partitions. | ||
+ | </ | ||
- | [mysqlslap] | + | Le partitionnement apporte trois avantages : |
- | [root@centos7 ~]# cat /etc/my.cnf.d/ | + | * Créer des tables plus grandes que la taille autorisée par un système de fichiers. Il est aussi possible de stocker des partitions à des endroits différents, |
- | # | + | |
- | # These groups are read by MariaDB server. | + | |
- | # Use it for options that only the server (but not clients) should see | + | |
- | # | + | |
- | # See the examples of server my.cnf files in / | + | |
- | # | + | |
- | # this is read by the standalone daemon and embedded servers | + | * Supprimer très rapidement des données en détruisant la partition qui les contient. Ceci s' |
- | [server] | + | |
- | # this is only for the mysqld standalone daemon | + | * Optimiser certaines requêtes car les données étant organisées dans différentes partitions. Ceci s' |
- | [mysqld] | + | |
- | # this is only for embedded server | + | ====Partitionnement Horizontal==== |
- | [embedded] | + | |
- | # This group is only read by MariaDB-5.5 servers. | + | ===LAB |
- | # If you use the same .cnf file for MariaDB of different versions, | + | |
- | # use this group for options that older servers don't understand | + | |
- | [mysqld-5.5] | + | |
- | # These two groups are only read by MariaDB servers, not by MySQL. | + | Créez une base de données **transactions** ainsi que la table **transac** : |
- | # If you use the same .cnf file for MySQL and MariaDB, | + | |
- | # you can put MariaDB-only options here | + | |
- | [mariadb] | + | |
- | [mariadb-5.5] | + | < |
+ | CREATE DATABASE transactions; | ||
+ | USE transactions; | ||
+ | CREATE TABLE transac | ||
+ | ( | ||
+ | id INT UNSIGNED PRIMARY KEY, | ||
+ | montant INT UNSIGNED NOT NULL, | ||
+ | jour DATE NOT NULL, | ||
+ | codePays ENUM(' | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | Database changed | ||
+ | MariaDB [(none)]> | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED PRIMARY KEY, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays ENUM(' | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Chaque section contient | + | Imaginons qu'en étudiant les requêtes |
- | Avec presque **300** options possibles et avec autant d'emplacements de fichiers de configuration, deux problèmes se posent. | + | < |
+ | CREATE TABLE transac_part | ||
+ | ( | ||
+ | id INT UNSIGNED NOT NULL, | ||
+ | montant INT UNSIGNED NOT NULL, | ||
+ | jour DATE NOT NULL, | ||
+ | codePays ENUM('FR', ' | ||
+ | ) PARTITION BY RANGE(YEAR(jour)) | ||
+ | ( | ||
+ | PARTITION p1 VALUES LESS THAN(1997), | ||
+ | PARTITION p2 VALUES LESS THAN(1998), | ||
+ | PARTITION p3 VALUES LESS THAN(1999), | ||
+ | PARTITION p4 VALUES LESS THAN(2000), | ||
+ | PARTITION p5 VALUES LESS THAN(2001), | ||
+ | PARTITION p6 VALUES LESS THAN(2002), | ||
+ | PARTITION p7 VALUES LESS THAN(2003), | ||
+ | PARTITION p8 VALUES LESS THAN(2004), | ||
+ | PARTITION p9 VALUES LESS THAN(2005), | ||
+ | PARTITION p10 VALUES LESS THAN(2006), | ||
+ | PARTITION p11 VALUES LESS THAN MAXVALUE | ||
+ | ); | ||
+ | </ | ||
- | * Comment savoir bien configurer le serveur, | + | < |
- | * Comment connaître avec exactitude la configuration actuelle. | + | MariaDB [(none)]> |
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays ENUM(' | ||
+ | -> ) PARTITION BY RANGE(YEAR(jour)) | ||
+ | -> ( | ||
+ | -> PARTITION p1 VALUES LESS THAN(1997), | ||
+ | -> PARTITION p2 VALUES LESS THAN(1998), | ||
+ | -> PARTITION p3 VALUES LESS THAN(1999), | ||
+ | -> PARTITION p4 VALUES LESS THAN(2000), | ||
+ | -> PARTITION p5 VALUES LESS THAN(2001), | ||
+ | -> PARTITION p6 VALUES LESS THAN(2002), | ||
+ | -> PARTITION p7 VALUES LESS THAN(2003), | ||
+ | -> PARTITION p8 VALUES LESS THAN(2004), | ||
+ | -> PARTITION p9 VALUES LESS THAN(2005), | ||
+ | -> PARTITION p10 VALUES LESS THAN(2006), | ||
+ | -> PARTITION p11 VALUES LESS THAN MAXVALUE | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.13 sec) | ||
- | ==Comment Savoir Bien Configurer le Serveur== | + | MariaDB [(none)]> |
+ | </ | ||
- | La réponse au premier problème se trouve dans les fichiers exemples fournis par Oracle. Ces fichiers se trouvent | + | <WRAP center round important 60%> |
+ | L' | ||
+ | </ | ||
+ | |||
+ | Créez ensuite une procédure pour injecter | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE PROCEDURE remplir_transaction(nbTransacs INT) | ||
+ | BEGIN | ||
+ | DECLARE i INT DEFAULT 1; | ||
+ | DECLARE nbAlea DOUBLE; | ||
+ | DECLARE _jour DATE; | ||
+ | DECLARE _montant INT UNSIGNED; | ||
+ | DECLARE _codePays TINYINT UNSIGNED; | ||
+ | |||
+ | WHILE i <= nbTransacs DO | ||
+ | SET nbAlea = RAND(); | ||
+ | SET _jour = ADDDATE(' | ||
+ | SET _montant = FLOOR(1 + (nbAlea * 9999)); | ||
+ | SET nbAlea = RAND(); | ||
+ | SET _codePays = FLOOR(1 + (nbAlea * 6)); | ||
+ | INSERT INTO transac (id, montant, jour, codePays) VALUES (i, _montant, _jour, _codePays); | ||
+ | SET i = i + 1; | ||
+ | END WHILE; | ||
+ | END // | ||
+ | |||
+ | DELIMITER ; | ||
+ | </ | ||
< | < | ||
- | [root@centos7 ~]# ls -l /usr/share/mysql | grep cnf | + | MariaDB |
- | -rw-r--r--. 1 root root 4920 Aug 4 20:28 my-huge.cnf | + | MariaDB [(none)]> |
- | -rw-r--r--. 1 root root 20438 Aug 4 20:28 my-innodb-heavy-4G.cnf | + | |
- | -rw-r--r--. | + | |
- | -rw-r--r--. | + | |
- | -rw-r--r--. | + | -> DECLARE _jour DATE; |
- | -rw-r--r--. 1 root root 656 Jun 8 16:25 README.mysql-cnf | + | |
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | -> SET _montant = FLOOR(1 + (nbAlea * 9999)); | ||
+ | | ||
+ | -> SET _codePays = FLOOR(1 + (nbAlea * 6)); | ||
+ | | ||
+ | -> SET i = i + 1; | ||
+ | -> END WHILE; | ||
+ | -> END // | ||
+ | Query OK, 0 rows affected (0.05 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Par exemple | + | Appelez ensuite la procédure et patientez 10 minutes. A l' |
< | < | ||
- | [root@centos7 ~]# cat / | + | MariaDB |
- | # Example MariaDB config file for very large systems. | + | ^CCtrl-C -- sending "KILL QUERY 2" to server ... |
- | # | + | Ctrl-C -- query aborted. |
- | # This is for a large system with memory of 1G-2G where the system runs mainly | + | MariaDB |
- | # MariaDB. | + | +----------+ |
- | # | + | | COUNT(*) | |
- | # MariaDB | + | +----------+ |
- | # locations which depend on the deployment platform. | + | | |
- | # You can copy this option file to one of those | + | +----------+ |
- | # locations. For information about these locations, do: | + | 1 row in set (0.09 sec) |
- | # ' | + | |
- | # Default options are read from the following files in the given order: | + | |
- | # More information at: http:// | + | |
- | # | + | |
- | # In this file, you can use all long options that a program supports. | + | |
- | # If you want to know which options a program supports, run the program | + | |
- | # with the "--help" option. | + | |
- | # The following options will be passed to all MySQL clients | + | MariaDB |
- | [client] | + | |
- | #password = your_password | + | |
- | port = 3306 | + | |
- | socket = / | + | |
- | # Here follows entries for some specific programs | + | Insérez maintenant les mêmes données dans la table **transac_part** : |
- | # The MySQL server | + | < |
- | [mysqld] | + | MariaDB |
- | port = 3306 | + | Query OK, 191939 rows affected (3.63 sec) |
- | socket = / | + | Records: 191939 |
- | skip-external-locking | + | |
- | key_buffer_size = 384M | + | |
- | max_allowed_packet = 1M | + | |
- | table_open_cache = 512 | + | |
- | sort_buffer_size = 2M | + | |
- | read_buffer_size = 2M | + | |
- | read_rnd_buffer_size = 8M | + | |
- | myisam_sort_buffer_size = 64M | + | |
- | thread_cache_size = 8 | + | |
- | query_cache_size = 32M | + | |
- | # Try number of CPU' | + | |
- | thread_concurrency = 8 | + | |
- | # Point the following paths to a dedicated disk | + | MariaDB [(none)]> |
- | #tmpdir = /tmp/ | + | +----------+ |
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | | ||
+ | +----------+ | ||
+ | 1 row in set (0.14 sec) | ||
- | # Don't listen on a TCP/IP port at all. This can be a security enhancement, | + | MariaDB [(none)]> |
- | # if all processes that need to connect to mysqld run on the same host. | + | </ |
- | # All interaction with mysqld must be made via Unix sockets or named pipes. | + | |
- | # Note that using this option without enabling named pipes on Windows | + | |
- | # (via the " | + | |
- | # | + | |
- | # | + | |
- | # Replication Master Server (default) | + | Pour voir l' |
- | # binary logging is required for replication | + | |
- | log-bin=mysql-bin | + | |
- | # required unique id between 1 and 2^32 - 1 | + | < |
- | # defaults to 1 if master-host is not set | + | MariaDB [(none)]> |
- | # but will not function as a master if omitted | + | +--------------+--------------+ |
- | server-id = 1 | + | | SUM(montant) | AVG(montant) | |
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.17 sec) | ||
- | # Replication Slave (comment out master section to use this) | + | MariaDB [(none)]> SELECT SUM(montant), AVG(montant) FROM transac_part WHERE jour BETWEEN |
- | # | + | +--------------+--------------+ |
- | # To configure this host as a replication slave, you can choose between | + | | SUM(montant) | AVG(montant) | |
- | # two methods : | + | +--------------+--------------+ |
- | # | + | | |
- | # 1) Use the CHANGE MASTER TO command | + | +--------------+--------------+ |
- | # the syntax is: | + | 1 row in set (0.03 sec) |
- | # | + | </ |
- | # CHANGE MASTER TO MASTER_HOST=< | + | |
- | # MASTER_USER=< | + | |
- | # | + | |
- | # where you replace < | + | |
- | # < | + | |
- | # | + | |
- | # Example: | + | |
- | # | + | |
- | # CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306, | + | |
- | # MASTER_USER='joe', MASTER_PASSWORD=' | + | |
- | # | + | |
- | # OR | + | |
- | # | + | |
- | # 2) Set the variables below. However, in case you choose this method, then | + | |
- | # start replication for the first time (even unsuccessfully, | + | |
- | # if you mistyped the password in master-password and the slave fails to | + | |
- | # connect), the slave will create a master.info file, and any later | + | |
- | # change in this file to the variables' | + | |
- | # overridden by the content of the master.info file, unless you shutdown | + | |
- | # the slave server, delete master.info and restart the slaver server. | + | |
- | # For that reason, you may want to leave the lines below untouched | + | |
- | # | + | |
- | # | + | |
- | # required unique id between 2 and 2^32 - 1 | + | |
- | # (and different from the master) | + | |
- | # defaults to 2 if master-host is set | + | |
- | # but will not function as a slave if omitted | + | |
- | #server-id = 2 | + | |
- | # | + | |
- | # The replication master for this slave - required | + | |
- | #master-host | + | |
- | # | + | |
- | # The username the slave will use for authentication when connecting | + | |
- | # to the master | + | |
- | #master-user | + | |
- | # | + | |
- | # The password the slave will authenticate with when connecting to | + | |
- | # the master | + | |
- | #master-password = < | + | |
- | # | + | |
- | # The port the master is listening on. | + | |
- | # optional | + | |
- | #master-port | + | |
- | # | + | |
- | # binary logging | + | |
- | #log-bin=mysql-bin | + | |
- | # | + | |
- | # binary logging format | + | |
- | # | + | |
- | # Uncomment the following if you are using InnoDB tables | + | Notez que la requête sur la table partitionnée retourne un résultat **5,67** fois plus vite que sur la table d' |
- | # | + | |
- | # | + | |
- | # | + | |
- | # You can set .._buffer_pool_size up to 50 - 80 % | + | |
- | # of RAM but beware of setting memory usage too high | + | |
- | # | + | |
- | # | + | |
- | # Set .._log_file_size to 25 % of buffer pool size | + | |
- | # | + | |
- | # | + | |
- | # | + | |
- | # | + | |
- | [mysqldump] | + | < |
- | quick | + | MariaDB |
- | max_allowed_packet = 16M | + | *************************** 1. row *************************** |
+ | id: 1 | ||
+ | select_type: | ||
+ | table: transac_part | ||
+ | | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 18035 | ||
+ | | ||
+ | 1 row in set (0.01 sec) | ||
- | [mysql] | + | MariaDB |
- | no-auto-rehash | + | </ |
- | # Remove the next comment character if you are not familiar with SQL | + | |
- | # | + | |
- | [myisamchk] | + | <WRAP center round important 60%> |
- | key_buffer_size = 256M | + | **Important** : |
- | sort_buffer_size = 256M | + | Notez que la valeur de la colonne **partitions** est **p3**. |
- | read_buffer = 2M | + | </ |
- | write_buffer = 2M | + | |
- | [mysqlhotcopy] | + | Evidemment, plus qu'il y a de partitions à consulter, moins important est le gains en performance : |
- | interactive-timeout | + | |
+ | < | ||
+ | MariaDB | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 198031481 | 2268.9216 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.18 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 198031481 | 2268.9216 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.16 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
- | Pour connaître toutes les options valides pour le serveur, il convient | + | Le système de partitionnement peut aussi s' |
< | < | ||
- | [root@centos7 ~]# / | + | MariaDB |
- | 171031 13:17:19 [Note] Plugin ' | + | +--------------+--------------+ |
- | / | + | | SUM(montant) | AVG(montant) |
- | Copyright | + | +--------------+--------------+ |
+ | | 959746672 | 5000.2692 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.16 sec) | ||
- | Starts the MariaDB | + | MariaDB |
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 959746672 | 5000.2692 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.20 sec) | ||
- | Usage: / | + | MariaDB |
+ | </ | ||
- | Default options are read from the following files in the given order: | + | Dernièrement, |
- | / | + | |
- | The following groups are read: mysqld server mysqld-5.5 mariadb mariadb-5.5 clie | + | |
- | nt-server | + | |
- | The following options may be given as the first argument: | + | |
- | --print-defaults | + | |
- | --no-defaults | + | |
- | --defaults-file=# | + | |
- | --defaults-extra-file=# | + | |
- | | + | < |
- | | + | MariaDB [(none)]> |
- | | + | Query OK, 17680 rows affected |
- | also means that one can load any function from any | + | |
- | | + | MariaDB [(none)]> ALTER TABLE transac_part DROP PARTITION p1; |
- | | + | Query OK, 0 rows affected |
- | --More-- | + | Records: 0 Duplicates: 0 Warnings: 0 |
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
+ | ===LAB #3 - Partitionnement par Listes=== | ||
- | Pour connaître | + | Imaginons maintenant que nous avons découvert que les requêtes des utilisateurs portent souvent sur continent géographique. Dans ce cas, il serait utile de faire un partitionnement par liste. Le champs crée par l'instruction suivante : |
+ | |||
+ | < | ||
+ | codePays ENUM(' | ||
+ | </ | ||
+ | |||
+ | associe une valeur entière à chaque valeur du champ de type ENUM. Nous allons utiliser ce fait pour créer | ||
+ | |||
+ | Commencez par nettoyer ce que vous avez déjà fait : | ||
< | < | ||
- | [root@centos7 ~]# mysql --help | more | + | MariaDB |
- | mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1 | + | Query OK, 0 rows affected |
- | Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. | + | |
- | Usage: mysql [OPTIONS] [database] | + | MariaDB |
+ | Query OK, 0 rows affected (0.09 sec) | ||
- | Default options are read from the following files in the given order: | + | MariaDB [(none)]> |
- | /etc/ | + | </code> |
- | The following groups are read: mysql client client-server client-mariadb | + | |
- | The following options may be given as the first argument: | + | |
- | --print-defaults | + | |
- | --no-defaults | + | |
- | --defaults-file=# | + | |
- | --defaults-extra-file=# | + | |
- | | + | Créez maintenant la table transac_part : |
- | -I, --help Synonym for -? | + | |
- | --abort-source-on-error | + | < |
- | Abort ' | + | MariaDB [(none)]> |
- | | + | |
- | ' | + | -> id INT UNSIGNED NOT NULL, |
- | and reconnecting may take a longer time. Disable with | + | |
- | --disable-auto-rehash. | + | -> jour DATE NOT NULL, |
- | (Defaults to on; use --skip-auto-rehash to disable.) | + | |
- | --More-- | + | |
+ | -> ( | ||
+ | -> PARTITION pEurope VALUES IN (1, 2, 3), | ||
+ | | ||
+ | | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected | ||
</ | </ | ||
- | ==Comment Connaître avec Exactitude | + | Appelez |
- | La réponse à la deuxième question est obtenue | + | < |
+ | MariaDB [(none)]> | ||
+ | ^CCtrl-C -- sending "KILL QUERY 2" to server ... | ||
+ | Ctrl-C -- query aborted. | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 52193 rows affected (0.57 sec) | ||
+ | Records: 52193 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | Comparez le gains de performance | ||
< | < | ||
- | [root@centos7 ~]# mysqladmin -uroot -p variables | more | + | MariaDB |
- | Enter password: | + | +--------------+--------------+ |
- | +---------------------------------------------------+--------------------------------------------------------------------------------- | + | | SUM(montant) | AVG(montant) | |
- | -------------------------------------------------------------------------------------------------------------------------------------- | + | +--------------+--------------+ |
- | -------------------------------------------------------------------------------------------------------------------------------------- | + | | 130838834 | 5018.9433 | |
- | -------------------------------------------------------------------------------------------------------------------------------------- | + | +--------------+--------------+ |
- | ------------------------------------------------------------------------------------------------------------------+ | + | 1 row in set (0.07 sec) |
- | | Variable_name | + | |
- | + | MariaDB [(none)]> | |
- | + | +--------------+--------------+ | |
- | + | | SUM(montant) | AVG(montant) | | |
- | | | + | +--------------+--------------+ |
- | +---------------------------------------------------+--------------------------------------------------------------------------------- | + | | 130838834 | 5018.9433 | |
- | -------------------------------------------------------------------------------------------------------------------------------------- | + | +--------------+--------------+ |
- | -------------------------------------------------------------------------------------------------------------------------------------- | + | 1 row in set (0.04 sec) |
- | -------------------------------------------------------------------------------------------------------------------------------------- | + | |
- | ------------------------------------------------------------------------------------------------------------------+ | + | MariaDB [(none)]> |
- | | aria_block_size | + | |
- | + | ||
- | + | ||
- | + | ||
- | | | + | |
- | | aria_checkpoint_interval | + | |
- | + | ||
- | + | ||
- | + | ||
- | | | + | |
- | | aria_checkpoint_log_activity | + | |
- | + | ||
- | + | ||
- | + | ||
- | | | + | |
- | | aria_force_start_after_recovery_failures | + | |
- | + | ||
- | + | ||
- | + | ||
- | | | + | |
- | --More-- | + | |
</ | </ | ||
- | ===Passer des Paramètres à l'Exécutable mysqld=== | + | Notez que la requête sur la table partitionnée retourne un résultat **1,75** fois plus vite que sur la table d'origine. |
- | Le serveur mysqld peut être paramétrer en passant des options à l' | + | Comparez |
- | ===Paramétrer le Serveur Dynamiquement=== | + | < |
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.05 sec) | ||
- | Pour paramétrer le serveur à chaud, il convient d' | + | MariaDB [(none)]> |
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
- | La portée des options peut être SESSION, c'est-à-dire pour la session en cours, ou GLOBAL pour toutes le sessions. | + | Notez que la requête sur la table partitionnée retourne un résultat **5** fois plus vite que sur la table d'origine. Ceci est du au fait qu'il y a moins d' |
+ | ===LAB #4 - Partitionnement par Hash=== | ||
- | ==SESSION== | + | Dans ce cas la partition à laquelle appartient un enregistrement est déterminée à partir de la valeur de retour d'une fonction définie par l' |
- | Prenant l' | + | Re-créez la table transac_part |
< | < | ||
- | [root@centos7 ~]# mysql -u root -p | + | MariaDB |
- | Enter password: | + | Query OK, 0 rows affected (0.03 sec) |
- | Welcome to the MariaDB monitor. | + | |
- | Your MariaDB connection id is 8 | + | |
- | Server version: 5.5.56-MariaDB MariaDB Server | + | |
- | Copyright | + | MariaDB [(none)]> |
+ | MariaDB [(none)]> | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays ENUM(' | ||
+ | -> ) PARTITION BY HASH(YEAR(jour)) PARTITIONS 11; | ||
+ | Query OK, 0 rows affected (0.07 sec) | ||
- | Type 'help;' or ' | + | MariaDB [(none)]> |
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 52193 rows affected (0.85 sec) | ||
+ | Records: 52193 Duplicates: 0 Warnings: 0 | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +----------------+----------+ | + | </ |
- | | Variable_name | + | |
- | +----------------+----------+ | + | |
- | | tmp_table_size | 16777216 | | + | |
- | +----------------+----------+ | + | |
- | 1 row in set (0.00 sec) | + | |
- | MariaDB [(none)]> SHOW SESSION VARIABLES LIKE ' | + | <WRAP center round important 60%> |
- | +----------------+----------+ | + | **Important** : |
- | | Variable_name | + | Notez qu'ici on indique le champs de référence **jour** et le nombre de partitions désirées. |
- | +----------------+----------+ | + | </ |
- | | tmp_table_size | 16777216 | | + | |
- | +----------------+----------+ | + | |
- | 1 row in set (0.01 sec) | + | |
- | MariaDB [(none)]> | + | Testez maintenant le gains de performance en utilisant les partitions : |
- | Query OK, 0 rows affected (0.00 sec) | + | |
- | MariaDB [(none)]> | + | < |
- | +----------------+----------+ | + | MariaDB [(none)]> |
- | | Variable_name | + | +--------------+--------------+ |
- | +----------------+----------+ | + | | SUM(montant) |
- | | tmp_table_size | + | +--------------+--------------+ |
- | +----------------+----------+ | + | | 10867590 |
- | 1 row in set (0.00 sec) | + | +--------------+--------------+ |
+ | 1 row in set (0.09 sec) | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +----------------+---------+ | + | +--------------+--------------+ |
- | | Variable_name | + | | SUM(montant) |
- | +----------------+---------+ | + | +--------------+--------------+ |
- | | tmp_table_size | + | | 10867590 |
- | +----------------+---------+ | + | +--------------+--------------+ |
- | 1 row in set (0.00 sec) | + | 1 row in set (0.08 sec) |
MariaDB [(none)]> | MariaDB [(none)]> | ||
Ligne 1078: | Ligne 2290: | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
+ | Notez qu'ici le gains de performance | ||
</ | </ | ||
- | ==GLOBAL== | + | Le gains de performance est minime parce que toutes les partitions ont été scannées |
- | + | ||
- | En utilisant la même option | + | |
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +----------------+----------+ | + | *************************** 1. row *************************** |
- | | Variable_name | + | id: 1 |
- | +----------------+----------+ | + | |
- | | tmp_table_size | 16777216 | | + | |
- | +----------------+----------+ | + | partitions: p0, |
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 52982 | ||
+ | Extra: Using where | ||
1 row in set (0.00 sec) | 1 row in set (0.00 sec) | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +----------------+---------+ | + | </ |
- | | Variable_name | + | |
- | +----------------+---------+ | + | |
- | | tmp_table_size | 8388608 | | + | |
- | +----------------+---------+ | + | |
- | 1 row in set (0.01 sec) | + | |
- | MariaDB [(none)]> SHOW SESSION VARIABLES LIKE 'tmp_table_size'; | + | <WRAP center round important 60%> |
- | +----------------+---------+ | + | **Important** : |
- | | Variable_name | + | Le partitionnement par hachage n'est efficace que dans le cas ou le hash est généré à partir d'une colonne de type entier. |
- | +----------------+---------+ | + | </ |
- | | tmp_table_size | 8388608 | | + | |
- | +----------------+---------+ | + | |
- | 1 row in set (0.01 sec) | + | |
- | MariaDB [(none)]> | + | Pour prouver ce point, recréez la table transac_part avec des partitions basées sur la colonne **codePays** : |
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 0 rows affected (0.22 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays TINYINT UNSIGNED NOT NULL | ||
+ | -> ) PARTITION BY HASH(codePays) PARTITIONS 6; | ||
+ | Query OK, 0 rows affected (0.23 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
+ | Query OK, 52193 rows affected (0.65 sec) | ||
+ | Records: 52193 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | Testez de nouveau le gain de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.04 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.02 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
+ | Cette fois-ci le gain est plus important. | ||
</ | </ | ||
+ | ===Partitionnement par Key=== | ||
- | Prenons maintenant le cas d' | + | Dans ce cas la partition à laquelle appartient un enregistrement est déterminée à partir de la valeur de retour |
+ | |||
+ | Par exemple : | ||
+ | |||
+ | < | ||
+ | CREATE TABLE transac_part | ||
+ | ( | ||
+ | id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, | ||
+ | | ||
+ | jour DATE NOT NULL, | ||
+ | | ||
+ | ) PARTITION BY KEY() PARTITIONS 5; | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : | ||
+ | Dans ce cas, la clef n'est pas spécifiée. Le hachage est généré à partir de tous les champs de la clef primaire. Dans notre cas c'est le champ **id**. Puisqu'il y a 5 partitions, si le nombre de données est de 100 000, le serveur mettra exactement 20 000 enregistrements dans chaque partition. | ||
+ | </ | ||
+ | |||
+ | ===LAB #5 - Sous-partitionnement=== | ||
+ | |||
+ | Avec MariaDB il est possible de créer des sous-partitions. Cependant il existe deux limitations : | ||
+ | |||
+ | * La partition de premier niveau doit être de type RANGE ou LIST, | ||
+ | * La partition de deuxième niveau doit être de type HASH ou KEY, | ||
+ | * Le nombre de partitions total ne peut pas dépasser **8192**. | ||
+ | |||
+ | Prenons le cas où les requêtes fréquentes portent sur les dates **et** sur la zone géographique. | ||
+ | |||
+ | Créez la table transac-part | ||
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +------------------+-------+ | + | Query OK, 0 rows affected (0.18 sec) |
- | | Variable_name | + | |
- | +------------------+-------+ | + | MariaDB [(none)]> |
- | | query_cache_size | + | MariaDB [(none)]> |
- | +------------------+-------+ | + | -> ( |
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays INT UNSIGNED NOT NULL | ||
+ | -> ) | ||
+ | -> PARTITION BY RANGE(YEAR(jour)) | ||
+ | -> SUBPARTITION BY HASH(codePays) SUBPARTITIONS 6 | ||
+ | -> ( | ||
+ | -> PARTITION p1 VALUES LESS THAN(1997), | ||
+ | -> PARTITION p2 VALUES LESS THAN(1998), | ||
+ | -> PARTITION p3 VALUES LESS THAN(1999), | ||
+ | -> PARTITION p4 VALUES LESS THAN(2000), | ||
+ | -> PARTITION p5 VALUES LESS THAN(2001), | ||
+ | -> PARTITION p6 VALUES LESS THAN(2002), | ||
+ | -> PARTITION p7 VALUES LESS THAN(2003), | ||
+ | -> PARTITION p8 VALUES LESS THAN(2004), | ||
+ | -> PARTITION p9 VALUES LESS THAN(2005), | ||
+ | -> PARTITION p10 VALUES LESS THAN(2006), | ||
+ | -> PARTITION p11 VALUES LESS THAN MAXVALUE | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (1.37 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | Testez maintenant le gain de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.05 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | ||
+ | +--------------+--------------+ | ||
+ | | 2928528 | 4073.0570 | | ||
+ | +--------------+--------------+ | ||
1 row in set (0.01 sec) | 1 row in set (0.01 sec) | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | ERROR 1229 (HY000): Variable ' | + | +--------------+--------------+ |
- | MariaDB [(none)]> | + | | SUM(montant) | AVG(montant) | |
- | Query OK, 0 rows affected | + | +--------------+--------------+ |
+ | | 261035779 | 5001.3561 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.07 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 261035779 | 5001.3561 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.09 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
+ | Notez la dégradation des performance avec les partitions dans le cas d'une requête sans clause WHERE : | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: transac_part | ||
+ | | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 893 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +------------------+--------+ | + | *************************** 1. row *************************** |
- | | Variable_name | + | id: 1 |
- | +------------------+--------+ | + | |
- | | query_cache_size | 122880 | | + | table: transac_part |
- | +------------------+--------+ | + | |
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 54365 | ||
+ | | ||
1 row in set (0.01 sec) | 1 row in set (0.01 sec) | ||
MariaDB [(none)]> | MariaDB [(none)]> | ||
</ | </ | ||
+ | ====LAB #6 - Partitionnement Vertical==== | ||
- | <WRAP center round important 60%> | + | Dans ce cas les partitions |
- | **Important** - Notez que pour une option ayant uniquement une portée globale, la modification de la valeur globale est prise en compte dans la session active. Notez aussi que les modifications à chaud ne sont pas persistants. | + | |
- | </ | + | |
- | ====LAB #3 - Le Mode SQL==== | + | < |
+ | MariaDB [(none)]> | ||
+ | | ||
+ | -> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, | ||
+ | -> libelle VARCHAR(50) NOT NULL, | ||
+ | -> prix DECIMAL(10, | ||
+ | -> photo BLOB NOT NULL | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | </ | ||
- | Le mode SQL est utilisé principalement pour empêcher l' | + | Séparez maintenant les photos des autres |
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +---------------+-------+ | + | -> ( |
- | | Variable_name | Value | | + | |
- | +---------------+-------+ | + | |
- | | sql_mode | + | |
- | +---------------+-------+ | + | |
- | 1 row in set (0.01 sec) | + | Query OK, 0 rows affected (0.04 sec) |
+ | |||
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Query OK, 0 rows affected | ||
MariaDB [(none)]> | MariaDB [(none)]> | ||
</ | </ | ||
- | Les valeurs de l' | + | Utilisez la procédure suivante pour injecter les données |
< | < | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | Query OK, 0 rows affected (0.00 sec) | + | MariaDB [(none)]> |
+ | MariaDB [(none)]> | ||
+ | -> BEGIN | ||
+ | -> DECLARE i INT DEFAULT 1; | ||
+ | -> DECLARE _prix DECIMAL(10, | ||
+ | -> DECLARE _photo BLOB DEFAULT REPEAT(' | ||
+ | -> | ||
+ | -> WHILE i <= nbProds DO | ||
+ | -> SET _prix = CAST((RAND() * 1000) AS DECIMAL(10, | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> SET i = i + 1; | ||
+ | -> END WHILE; | ||
+ | -> END // | ||
+ | Query OK, 0 rows affected (0.10 sec) | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
- | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | + | MariaDB [(none)]> |
- | | Variable_name | Value | + | MariaDB [(none)]> |
- | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | + | ^CCtrl-C -- sending "KILL QUERY 3" to server ... |
- | | sql_mode | + | Ctrl-C -- query aborted. |
- | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | + | ERROR 1317 (70100): Query execution was interrupted |
- | 1 row in set (0.00 sec) | + | MariaDB [(none)]> |
+ | +----------+ | ||
+ | | COUNT(*) | ||
+ | +----------+ | ||
+ | | 1664 | | ||
+ | +----------+ | ||
+ | 1 row in set (0.02 sec) | ||
- | MariaDB [(none)]> | + | MariaDB [(none)]> |
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | 1664 | | ||
+ | +----------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | 1663 | | ||
+ | +----------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | MariaDB [(none)]> | ||
</ | </ | ||
+ | |||
+ | |||
+ | Testez maintenant le gain de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | MariaDB [(none)]> | ||
+ | MariaDB [(none)]> | ||
+ | </ | ||
+ | |||
----- | ----- | ||
< | < | ||
< | < | ||
- | Copyright © 2011-2018 I2TCH LIMITED | + | Copyright © 2020 Hugh Norris. |
</ | </ | ||
</ | </ |