• 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.9.1 New Features Planned For 4.1

Les fonctionnalités suivantes ne sont pas encore en MySQL 4.1, mais il est prévu de les

implémenter avant que MySQL 4.1 passe en version beta. Pour une liste des fonctionnalités déjà disponibles en MySQL 4.1, voyez Features Available From MySQL 4.1 .

Support OpenSSL stable (MySQL 4.0 le supporte déjà de manière rudimentaire, mais ce n'est pas un support testé à 100%).

Transtypages de jeux de caractères, et syntaxe pour gérer plusieurs jeux de caractères simultanés.

Plus de tests sur les requêtes préparées et les jeux de caractères multiples.

Options de groupe ROLLUP

OLAP (Online Analytical Processing) pour les applications d'entrepôt de données.

Le développement des nouvelles fonctionnalités est passé en version 5.0.

1.9.2 New Features Planned For 5.0

Les fonctionnalités suivantes sont prévues pour la version 5.0. Notez que comme nous avons de nombreux développeurs qui travaillent sur différents projets, il peut aussi y avoir des ajouts de fonctionnalités. Il y a aussi des chances que ces fonctionnalités soient ajoutées en MySQL 4.1. Pour une liste des fonctionnalités déjà disponibles en MySQL 4.1, voyez Features Available From MySQL 4.1 .

Procédures stockées

Les procédures stockées sont actuellement développées avec notre version 5.0. Elles sont basées sur les spécifications SQL−99, qui a une syntaxe simple, proche (mais différente) de celle d'Oracle PL/SQL. Nous allons aussi ajouter un environnement SQL−99 pour permettre l'utilisation de langage externes et assurer (lorsque c'est possible) une compatibility avec PL/SQL et T−SQL.

Nouvelle fonctionnalité

Support élémentaire des curseurs.

Compatibilité avec les standards, portabilité et migration.

Ajout d'un véritable type VARCHAR

(ce support est déjà disponible avec le format de table MyISAM

).

Amélioration de la vitesse

SHOW COLUMNS FROM table_name

(utilisé par le client mysql

pour permettre la recherche de nom de colonnes) ne devrait pas ouvrir la table, mais seulement le fichier de définition. Cela prendra moins de mémoire, et sera bien plus rapide.

Permettre à la commande DELETE

sur les tables MyISAM

l'utilisation des caches de lignes. Pour cela, nous devons modifier le thread de cache de ligne lorsque nous modifions le fichier .MYD

.

Amélioration des tables en mémoire HEAP

: Lignes de taille dynamique.

Gestion plus rapide des lignes (moins de copies).

Internationalisation

Lorsque nous utilisons SET CHARACTER SET

, nous devrions traduire toute la requête en un coup, et non par chaînes. Cela permettra aux utilisateurs d'exploiter des caractères traduits dans les noms de base, table et colonne.

Amélioration de l'ergonomie

Résolution du problème avec RENAME TABLE

, utilisé sur une table active dans un

MERGE

, qui conduit à la corruption de la table.

1.9.3 Nouvelles fonctionnalités prévues pour 5.1

Nouvelle fonctionnalité

FOREIGN KEY

supporte tous les types de tables. Contraintes de niveau colonne.

Réplication protégé contre les crash.

Sauvegarde à chaud, avec peu d'impact sur les performances. La

sauvegarde à chaud permettra de simplifier l'ajout d'esclaves de réplication sans avoir à éteindre le maître.

Amélioration de la vitesse

Nouveau format de définition des tables en format texte (fichiers .frm

) et un cache de table pour les définitions de tables. Cela permettra d'accélérer les requêtes de structure de tables, et de consolider le support des clés

étrangères.

Optimisation du type BIT

pour qu'il prenne 1 bit (actuellement, BIT

prend 1 caractère).

Amélioration de l'ergonomie

Ajout Ajout d'option au protocole client/server pour obtenir des indications de progression pour les requêtes longues.

Implementation de RENAME DATABASE

. Pour que cela soit sécuritaire pour tous les pilotes de stockage, cela doit fonctionner comme ceci :

Crée une nouvelle base de données.

Pour chaque table, faire un renommage d'une base à l'autre, comme nous le faisons avec RENAME

.

Effacer l'ancienne base.

Nouvelle interface interne pour les fichirs. Cela rendra la gestion des fichiers bien plus générale, et simplifiera l'ajout d'extensions comme RAID.

(l'implémentation actuelle est un hack).

1.9.4 Ce qui doit être fait dans un futur proche

Nouvelle fonctionnalité

Commande CONNECT BY PRIOR ...

, inspirée d'Oracle, pour traiter les structures de type arbre (hiérarchical).

Tous les types manquants de ANSI92 et ODBC 3.0. Ajout de SUM(DISTINCT)

.

INSERT SQL_CONCURRENT

et mysqld −−concurrent−insert

pour faire des insertions concurrents à la fin du fichier, même si il est verrouillé en lecture.

Permettre la modification de variables dans une commande UPDATE

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

.

Changer le moment de modifications des variables, pour que l'on puisse les utiliser avec les commandes de groupement GROUP BY

, comme ceci : SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM table_name GROUP BY id

. Ajout de l'option IMAGE

à la commande LOAD DATA INFILE

pour ne pas modifier les champs TIMESTAMP

et AUTO_INCREMENT

.

Ajout de la syntaxe LOAD DATE INFILE ... UPDATE

.

Pour les tables ayant des clés primaires, si les données contiennent une clé primaire, les données qui existent et correspondent à cette clé, sont modifiées. Cependant, les colonnes omises sont ignorées. Pour les tables ayant une clé primaire dont il manque une partie dans les données entrantes, ou qui n'ont pas de clé primaire, le flux est traité comme LOAD DATA INFILE ... REPLACE INTO

. Rendre la syntaxe LOAD DATA INFILE

utilisable comme 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

Cela peut être utilisé pour ignorer des colonnes supplémentaires dans le fichier texte, ou pour modifier des colonnes en fonction de données dans les valeurs entrantes.

LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' ERRORS TO err_table_name

. Cela va faire que les erreurs et alertes ne seront pas enregistrées dans la table err_table_name

. Cette table a la strucutre suivante :

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

et peut être

data_line − le numéro de ligne dans le fichier de données

De nouvelles fonctions pour travailler avec le type de colonne SET

:

ADD_TO_SET(value,set) REMOVE_FROM_SET(value,set)

Ajout de l'utilisation de t1 JOIN t2 ON ...

et t1 JOIN t2 USING ...

Actuellement, nous ne pouvons utiliser cette syntaxe qu'avec LEFT JOIN

. Si vous interrompez mysql

au beau milieu d'une requête, vous pouvez ouvrir une autre connexion pour tuer la requête en cours. Ou bien, une tentative doit être faite pour détecter cela sur le serveur.

Ajouter d'une interface au moteur de sauvegarde pour que vous puissiez l'utiliser comme table système. Cela sera un peu lent si vous demandez toutes les informations de toutes les tables, mais très souple. SHOW INFO FROM tbl_name

doit être implémenté pour connaitre les informations de bases des tables.

Permettre SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a)

; dans ce cas, a

est supposé provenir de la table crash_me

. Les options DELETE

et REPLACE

dans les commandes UPDATE

(cela va effacer les lignes lors d'un doublon dans la requête).

Modification du format de DATETIME

pour stocker les fractions de secondes. Rendre possible l'utilisation de la librairie GNU regexp library au lieu de la librairie actuelle (la librairie GNU library devrait être plus rapide que l'ancienne).

Compatibilité avec les standard, migration et portabilité.

Ne pas utiliser de valeur par défaut ( DEFAULT

) pour les colonnes. Indiquer une erreur lors des commandes INSERT

, si elle contient une colonne qui n'a pas de valeur par défaut.

Ajout des fonctions de groupement ANY()

, EVERY()

et SOME()

. En ANSI SQL, elles ne fonctionnent que sur les colonnes de type booléens, mais nous pouvons étendre leur champ d,action aux colonnes et expression, en appliquant la règle suivante : value == 0 −> FALSE et value <> 0 −> TRUE.

Correction du type pour que MAX(column)

ait le mêm type de colonne :

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;

Amélioration des performances

Ne permettre qu'à un nombre défini de threads d'exécuter des réparations MyISAM simultanément.

Changer INSERT ... SELECT

pour utiliser optionnellement des insertions simultanées.

Ajouter une option pour écrire sur le disque les pages de clés pour les tables à clés retardées, qui n'ont pas été sauvées dernièrement.

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

/ pwrite()

sur Windows pour permettre les insertions concurrentes.

Un analyseur de logs, qui permettrait d'extraire des informations sur les tables les plus souvent utilisées, les jointures, etc... Cela permettra aux utilisateurs d'identifier les tables qui peuvent être optimisées.

Internationalisation Ergonomie

Retourner le type de champs original lors des requêtes SELECT MIN(column) ... GROUP BY

.

Rendre possible la spécification de long_query_time

avec une granularité de l'ordre de la micro seconde.

Intégrer le code de myisampack

dans le serveur, activer les commandes PACK et COMPRESS depuis le serveur.

Ajouter un cache de buffer de clé temporaire durant les commandes

INSERT/DELETE/UPDATE

pour que nous puissions nous rétablir si jamais le fichier d'index est plein.

Si vous effectuez la commande ALTER TABLE

sur une table qui est un lien symbolique sur un autre disque, les tables tempooraires seront aussi faites sur ce disque.

Implémenter un type DATE/DATETIME

qui gère les fuseaux horaire correctement, pour résoudre le problème du décalage horaire.

Corriger la configuration pour que l'on puisse compiler toute les librairies (comme MyISAM

) sans les threads.

Permettre toutes les variables SQL dans la clause LIMIT

, comme par exemple

LIMIT @a,@b

.

Affichage automatique de mysql

vers un serveur web.

LOCK DATABASES

(avec différentes options).

De nombreuses nouvelles variables dans SHOW STATUS

. Les lignes lues et modifiées. Les sélections sur tables uniques et les jointures. Le nombre moyen de tables dans une sélection. Le nombre de rquêtes ORDER BY

et GROUP BY

.

mysqladmin copy database new−database

; a besoin de la commande COPY

dans mysqld

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

SHOW HOSTS

affichera les informatiosn concernant le cache de noms d'hôtes. Changer le nom des tables de chaîne vide à NULL

pour les colonnes calculées. Ne pas utiliser la fonction Item_copy_string

sur les valeurs numériques, pour éviter les conversions nombre −> chaîne −> nombre en cas de : SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id

Changer ALTER TABLE

pour qu'il n'interrompe pas le client qui exécute des INSERT DELAYED

.

Lorsque les colonnes sont spécifiées dans UPDATE

, elles contiennent les anciennes valeurs d'avant la modification.

Nouveaux systèmes d'exploitation.

Port de MySQL vers QNX. Port de MySQL vers BeOS.

Port des clients MySQL vers LynxOS.

1.9.5 Ce qui est prévu à moyen terme

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.

Support des vues simples (d'abord sur une table, ensuite 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 connexions/écritures/lectures 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).

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.9.6 Ce qui n'est pas prévu

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