• Aucun résultat trouvé

Les évolutions de MySQL (la liste des tâches)

Cette section liste les fonctionnalités que nous prévoyons d'ajouter à MySQL.

La liste est grossièrement réalisée dans l'ordre de priorité. Si vous voulez modifier cet ordre, achetez une licence de support, et dites−nous ce que vous souhaitez voir en premier. MySQL Support and Licensing .

L'objectif est de supporter complètement la norme ANSI SQL99, tout en lui ajoutant de nombreuses améliorations. Le défi est de faire tout cela sans sacrifier la vitesse d'exécution, ni la qualité du code.

1.8.1 Ce que devrait inclure la version 4.0

Tout est fait. Nous ne fournissons plus que des corrections de bogues pour MySQL 4.0. Changements dans la publication 4.0.x (Beta) . Le développement est passé à la version 4.1

1.8.2 Ce qui est prévu pour la version 4.1

Les fonctionnalités suivantes sont prévues pour être ajoutées dès la version 4.1. Notez que comme nous avons de nombreux développeurs qui travaillent sur différents projets, il y aura aussi de nombreuses améliorations. Il y a aussi de faibles chances pour que ces fonctionnalités soient ajoutées à la version 4.0. Certaines fonctionnalités sont déjà installées dans la version MySQL 4.1.

Sous−sélections.

SELECT id FROM t WHERE grp IN (SELECT grp FROM g WHERE u > 100);

Un nouveau format de définition de table (fichiers .frm ). Il nous permettra de ne pas être à court de place lors de l'ajout de nouvelles options. Les anciens fichiers sont toujours

compatibles avec la version 4.0. Toutes les nouvelles tables utiliseront ce nouveau format.Le nouveau format de fichier nous permettra d'ajouter de nouveaux types de colonnes, plus d'options pour les clés, et alloueront de la place pour les définitions des

FOREIGN KEY .

SHOW COLUMNS FROM table_name (utilisé par le client mysql pour afficher le détail des colonnes) ne devrait pas ouvrir la table, mais uniquement le fichier de définition. Cela consommera moins de mémoire, et sera plus rapide.

Le support des clés étrangères pour les tables MyISAM , incluant les effacement en cascade.

La réplication infaillible.

La réplication devrait fonctionner avec la fonction RAND() et la variable utilisateur @var .

Sauvegarde à chaud, avec faible réduction des performances. La sauvegarde en ligne rendra simple le nouveau système de réplication, sans éteindre le serveur maître.

Tables dérivées :

SELECT a.col1, b.col2

FROM (SELECT MAX(col1) AS col1 FROM root_table) a, other_table b

WHERE a.col1=b.col1;

Cela peut se faire automatiquement, en créant des tables temporaires pour les tables dérivées, pour la durée de la requête.

Fonction de groupement ROLLUP et CUBE OLAP (Online Analytical Processing) pour les applications de dépôts de données.

Permettre que la commande DELETE , sur les tables MyISAM , utilise le cache de lignes. Pour cela, nous devons modifier les threads de cache de ligne lorsque nous modifions le fichier .MYD .

Lors de l'utilisation de SET CHARACTER SET , il faudrait traduire toute la requête, et non pas seulement les chaînes. Cela permettra aux utilisateurs d'utiliser les caractères traduits dans les noms de tables, bases et colonnes.

Ajouter la méthode record_in_range() à la commande MERGE pour être capable de choisir le bon index lorsqu'il y a trop de choix. Nous devrions aussi étendre l'interface d'informations pour lire la distribution des clés de chaque index, si analyze est exécuté sur toutes les tables.

Résoudre le problème avec la commande RENAME TABLE lorsqu'elle est utilisée sur une table active MERGE , ce qui conduit actuellement à la corruption de la table.

Une librairie MySQL intégrée plus rapide est plus compacte (compatible avec l'ancienne).

Support OpenSSL stable (MySQL 4.0 supporte OpenSSL mais cela reste rudimentaire et pas totalement testé).

Ajout du support en fonction de l' UNICODE .

Transtypage de jeux de caractères et des syntaxes pour gérer simultanément plusieurs jeux de caractères.

Aide pour toutes les commandes du client.

Nouveau protocole client/serveur plus rapide qui supportera les commandes préparées, les paramètres liés, et les résultats liés, les transferts binaires de données, les alertes...

Ajout des vrais noms de tables et de bases (dans le cas d'un alias) à la structure MYSQL_FIELD.

Ajout d'options au protocole client/serveur pour obtenir des informations sur la progression des requêtes lentes.

L'implémentation de RENAME DATABASE . Pour que cela soit sécuritaire pour tous les gestionnaires de table, cela doit fonctionner comme ceci :

Créer la nouvelle base de données.

Pour chaque table, renommer la table dans la nouvelle base de données, en utilisant l'équivalent de la commande RENAME .

Effacer l'ancienne base de données.

♦ •

Ajouter le vrai support des VARCHAR (Il y a déjà ce support avec les tables MyISAM ).

Optimiser le type BIT pour qu'il prenne un bit (actuellement, BIT prend un caractère).

Nouvelle interface interne avec les fichiers. Cela rendra plus générique la gestion des fichiers, et rendra plus simple des extensions du type RAID. (L'implémentation actuelle est un hack.)

Améliorer les tables en mémoire ( HEAP ) : Support des index B−tree

Lignes de taille dynamique

Accélération de la gestion des lignes (moins de copie)

♦ •

1.8.3 Ce qui doit être fait dans un futur proche

Limiter le nombre de threads qui travaillent à la restauration d'une table MyISAM en même temps.

Changer le code de la commande INSERT ... SELECT pour supporter les insertions concurrentes, en option.

Retourner le type original des champs avec la commande SELECT MIN(column) ... GROUP BY .

Support des résultats multiples.

Rendre possible la spécification de long_query_time avec une granularité en

microsecondes.

Lier le code de myisampack dans le serveur.

Porter le code de MySQL sur QNX.

Porter le code de MySQL sur BeOS.

Porter le code du client MySQL sur LynxOS.

Ajouter un buffer de clés temporaires durant les commandes INSERT/DELETE/UPDATE de manière a le restaurer proprement si le fichier d'index se remplit.

Si vous exécutez une commande ALTER TABLE sur une table qui est liée symboliquement sur un autre disque, les tables temporaires devraient être créées dans ce disque.

Implémenter un type DATE/DATETIME qui gère les données de fuseaux horaires correctement, afin de simplifier la gestion de ces derniers.

FreeBSD et MIT−pthreads; est−ce que les threads en veille consomment du temps processeur ?

Vérifier si les threads verrouillés consomment du temps processeur.

Corriger le script de configure pour que l'on puisse compiler toutes les librairies (comme

MyISAM ) sans les threads.

Ajouter une option pour vider périodiquement les pages de clés, avec des clés retardées si on ne les a pas utilisées depuis un bon moment.

Permettre les jointures sur des parties de clés (problème d'optimisation).

INSERT SQL_CONCURRENT et mysqld −−concurrent−insert pourraient réaliser des insertions concurrentes à la fin du fichier, si le fichier est verrouillé en lecture.

Les curseurs coté serveur.

Vérifier si lockd fonctionne avec les noyaux moderne. Si ce n'est pas le cas, nous devons corriger lockd ! Pour tester cela, démarrez mysqld avec l'option −−enable−locking et lancez différents tests de fork*. Si cela fonctionne, il ne doit y avoir aucune erreur.

Permettre des variables SQL dans la clause LIMIT , comme LIMIT @a,@b .

Permettre les modifications de variables dans les commandes UPDATE . Par exemple :

UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c .

Changer les modifications de variables utilisateur pour que l'on puisse les utiliser avec la clause GROUP BY , comme ceci : SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM nom_de_table GROUP BY id .

Ne pas utiliser de valeur par défaut DEFAULT automatiquement. Générer une erreur lorsque la commande INSERT ne contient pas la valeur d'une colonne qui n'a pas de valeur par

DEFAULT .

Corriger libmysql.c pour permettre les commandes mysql_query() dans une ligne sans lire les résultats, ou afficher une erreur lorsque l'on tente de le faire.

Vérifier pourquoi MIT−pthreads ctime() ne fonctionne pas sur certains systèmes FreeBSD.

Ajouter une option IMAGE à la commande LOAD DATA INFILE pour ne pas modifier les colonnes de type TIMESTAMP et AUTO_INCREMENT .

Ajouter la syntaxe LOAD DATE INFILE ... UPDATE .

Pour les tables avec clés primaires, si les données ne contiennent pas de clé primaire, les entrées qui correspondent à cette clé primaire sont modifiées avec le reste des colonnes. Cependant, les colonnes qui manquent dans les données entrantes sont ignorées.

Pour les tables avec des clés primaires à qui il manque une partie de la clé dans les données entrantes, ou si il n'y a pas la clé primaire, les données sont traitées comme pour LOAD DATA INFILE ... REPLACE INTO .

♦ •

Faire que la commande LOAD DATA INFILE comprenne ceci :

LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=CONCAT(text_field1, text_field2), table_field3=23

IGNORE text_field3

Ceci peut être utilisé pour sauter les colonnes de texte supplémentaire dans le fichier, ou

pour modifier des colonnes en se basant sur les données lues.

LOAD DATA INFILE 'file_name' INTO TABLE 'nom_de_table' ERRORS TO err_nom_de_table . Cette commande enregistrera les erreurs et les alertes dans la table

err_nom_de_table . Cette table aura la structure suivante :

line_number − numéro de ligne dans le fichier de données error_message − Le message d'erreur ou d'alerte

Ou peut être

data_line − La ligne du fichier de données

Affichage automatique de mysql vers Netscape.

LOCK DATABASES (avec différentes options).

Fonctions : ADD_TO_SET(value,set) et REMOVE_FROM_SET(value,set).

Ajouter les syntaxes t1 JOIN t2 ON ... et t1 JOIN t2 USING ... Actuellement, vous ne pouvez utiliser cette syntaxe qu'avec LEFT JOIN .

Bien plus de valeurs dans la commande show status . Les lignes lues et modifiées. Les sélections sur une table et les jointures. Le nombre moyen de table dans une sélection. Le nombre de clause ORDER BY et GROUP BY dans les requêtes.

Si vous interrompez mysql au beau milieu d'une requête, vous devriez ouvrir une autre connexion, et tuer l'ancienne requête. Alternativement, une tentative de détection doit avoir lieu sur le serveur.

Ajouter un gestionnaire d'interface pour les informations de tables, de manière à pouvoir l'utiliser comme une table système. Cela serait un peu lent si vous demandez toutes les informations sur toutes les tables, mais c'est très souple. SHOW INFO FROM tbl_name

pour les informations simples de tables devrait être implémenté.

NATURAL JOIN .

Permettre la commande SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a) ; dans ce cas, a est supposé provenir de la table crash_me .

Corriger le code pour que ON et USING fonctionne avec les jointures de type JOIN .

Commande Oracle CONNECT BY PRIOR ... pour rechercher les hiérarchies.

mysqladmin copy database new−database ; requiert la commande COPY dans

mysqld .

La liste des processus devrait afficher le nombre de requêtes et de threads.

SHOW HOSTS doit afficher les informations sur les noms d'hôte en cache.

Options de DELETE et REPLACE dans la commande UPDATE (cela effacerait des lignes lorsque une clé voit un doublon surgir durant la mise à jour).

Modifier le format de DATETIME pour stocker les fractions de secondes.

Ajout de tous les types de données qui manquent de ANSI92 et ODBC 3.0.

Changer les noms des tables de chaîne vide en NULL pour les colonnes calculées.

Ne pas utiliser Item_copy_string sur les valeurs numériques pour éviter la conversion nombre −> chaîne −> nombre dans le cas de : SELECT COUNT(*)*(id+0) FROM nom_de_table GROUP BY id

Rendre possible l'utilisation de la nouvelle librairie d'expression régulière GNU en lieu et place de celle qui a actuellement cours (la librairie GNU devrait être bien plus rapide).

Modifier la commande ALTER TABLE pour qu'elle n'interrompe pas les clients qui exécutent des commandes INSERT DELAYED .

Corriger le code pour que lorsque les colonnes sont référencées dans une commande

UPDATE , elle contiennent les anciennes valeurs, et non pas les nouvelles.

Ajouter la simulation de pread() / pwrite() sous Windows pour permettre les insertions concurrentes.

Un analyseur de fichiers de log, qui pourrait traiter les données et indiquer quelles tables sont les plus souvent utilisées, combien de jointures sont faites, etc. Cela aidera les utilisateurs à identifier les points sensibles dans leur conception de bases de données.

Ajouter SUM(DISTINCT) .

Ajouter les fonctions de groupement ANY() , EVERY() et SOME() . En ANSI SQL, elles ne fonctionnent que sur les colonnes de type booléen, mais nous pouvons les étendre pour qu'elles fonctionnent sur n'importe quelle type de colonne ou d'expression en appliquant la

conversion valeur == 0 −> FALSE et valeur <> 0 −> TRUE.

Faire que le type de MAX(column) soit le même que le type de la colonne utilisé. Par exemple :

mysql> CREATE TABLE t1 (a DATE); mysql> INSERT INTO t1 VALUES (NOW());

mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1; mysql> SHOW COLUMNS FROM t2;

Inventer une syntaxe pratique pour une commande qui va modifier avec UPDATE une ligne si elle existe, et sinon, faire un insertion INSERT si cette ligne n'existe pas. (Comme

REPLACE le fait avec INSERT / DELETE ).

1.8.4 Ce qui est prévu pour plus tard

Implémenter la fonction : get_changed_tables(timeout,table1,table2,...) .

Remplacer la lecture dans les tables par une zone mémoire aussi souvent que possible. Actuellement, seules les tables compressées utilisent des memmap.

Rendre le code des timestamp automatiques bien plus pratique. Ajouter les timestamps dans le log avec SET TIMESTAMP=#; .

Utiliser un mutex de lecture/écriture pour gagner de la vitesse.

Ajouter le support complet des clés étrangères pour les tables MyISAM , probablement après l'implémentation des procédures stockées et des triggers.

Des vues simples (sur une table, puis sur une expression).

Fermer automatiquement des tables si une table, une table temporaire ou un fichier temporaire reçoit une erreur 23 (plus assez de fichiers ouverts).

Lors de la rencontre de field=#, changez toutes les occurrences du champ en #. Actuellement, cela n'est fait que pour les cas simples.

Changer toutes les expressions constantes par des expressions calculées, si possible.

Optimiser la relation clé = expression. Actuellement, seul les relations clé = champ et clé = constante sont optimisées.

Fusionner les fonctions de copie pour améliorer le code.

Changez sql_yacc.yy pour le remplacer par un analyseur de ligne de commande plus petit, et qui gère mieux les messages.

Changer l'analyseur pour utiliser uniquement une règle pour tous les nombres d'arguments possibles dans une fonction.

Utiliser les calculs de noms complets dans la clause ORDER (pour ACCESS97).

MINUS , INTERSECT et FULL OUTER JOIN . (actuellement, UNION [en 4.0] et LEFT OUTER JOIN fonctionnent).

SQL_OPTION MAX_SELECT_TIME=# pour donner une limite de temps à une requête.

Diriger le log d'historique vers une base.

Améliorer LIMIT pour permettre la lecture de données à la fin du résultat.

Alertes lors des connexion/écriture/lecture du client.

Notez ces modifications de safe_mysqld : selon la FSSTND (que Debian essaie de suivre) les fichiers PID devraient être placés dans /var/run/<progname>.pid et les fichiers de logs dans /var/log . Il serait bien si vous pouviez mettre le "DATADIR" dans la première déclaration de "pidfile" et "log", de façon à ce que l'emplacement de ces fichiers puisse être modifié en une seule ligne.

Permettre au client de commander le log des actions.

Ajouter l'utilisation de zlib() pour les fichiers gzip , avec la commande LOAD DATA INFILE .

Corriger le tri et le groupage avec les colonnes BLOB (en partie résolu).

Procédures stockées. Les triggers sont aussi au programme.

Un langage de modification simple et atomique, qui peut être utilisé pour écrire des boucles dans le serveur MySQL.

Utiliser des sémaphores pour compter les threads. Il faut commencer par implémenter des sémaphores pour MIT−pthreads.

Ne pas assigner de nouvelle valeur AUTO_INCREMENT lorsque l'on utilise la valeur 0. Utilisez NULL à la place.

Ajouter le support complet pour les JOIN avec parenthèses.

Comme alternative à la relation un thread, une connexion, gérer un groupe de threads pour répondre aux requêtes.

Permettre la pose de plusieurs verrous avec GET_LOCK . Lors de ces verrous multiples, gérer le cas des blocages par verrous qui pourrait être introduit.

Le temps est indiqué en temps de travail et non pas en temps normal.

1.8.5 Ce qui n'est pas prévu

Rien. Nous nous dirigeons vers la compatibilité complète avec ANSI 92/ANSI 99.