MySQL/API

Un livre de Wikilivres.

L'interface de programmation (API) MySQL permet aux applications d’interagir avec les bases de données.

Optimisation[modifier | modifier le wikicode]

Appels API[modifier | modifier le wikicode]

Connexions persistantes[modifier | modifier le wikicode]

En utilisant les connexions persistantes, plusieurs requêtes peuvent être exécutées sans reconnexion. C'est un gain de temps pour l'utilisateur, mais le serveur doit y allouer une partie de sa RAM pendant tout ce temps, ce qui peut le saturer, surtout quand tous ses sites le font.

Mémoire libre[modifier | modifier le wikicode]

Certaines requêtes enregistrent une ligne dans une variable. Cela peut donc avoir du sens de libérer cette mémoire un peu avant la fin du script, plutôt qu'à la toute fin.

Recherche de ligne[modifier | modifier le wikicode]

La plupart des APIs proposent deux types de recherches de ligne : en tableau (associatif ou pas) ou en objet.

Assigner les lignes dans un objet est plus lent, alors que le tableau non associatif est le plus rapide (et c'est le mieux si on ne prend qu'un seul champ par enregistrement).

API vs SQL[modifier | modifier le wikicode]

Généralement, les APIs ont des méthodes optimisées qui créent des commandes SQL et les envoient au serveur MySQL.

Réduire les communications client/serveur[modifier | modifier le wikicode]

  • Certains scripts utilisent deux requêtes pour extraire une table pivot. Les communications client/serveur étant toujours le facteur ralentissant des applications, il faut préférer une seule jointure à la place.
  • Si toutefois plusieurs requêtes s'avèrent nécessaires, utiliser les connexions persistantes.
  • Ne sélectionner que le minimum de champs (éviter *).
  • Éviter d'inclure dans les commandes SQL des caractères inutiles (espaces, tabs, commentaires...).

CREATE ... SELECT, INSERT ... SELECT[modifier | modifier le wikicode]

Lors de création de nouvelle table depuis une existante, CREATE ... SELECT peut être utilisé.

Pour remplir une table existante, c'est INSERT ... SELECT ou REPLACE ... SELECT.

INSERT DELAYED[modifier | modifier le wikicode]

Certains scripts n'ont pas besoin de vérifier si les insertions se sont bien déroulées.

Dans ce cas, faire appel à INSERT DELAYED pour que le serveur n'attende pas.

REPLACE[modifier | modifier le wikicode]

Lors d'un DELETE précédé d'un INSERT, le serveur reçoit deux commandes SQL.

En revanche, avec REPLACE il n'en reçoit qu'une.

De plus, REPLACE DELAYED est possible.

Autres techniques[modifier | modifier le wikicode]

Stocker les données dans des cookies[modifier | modifier le wikicode]

Parfois, des données de session sont stockées dans la base.

Cela nécessite un UPDATE et un SELECT à charge chargement de page.

Cela peut être évité avec les cookies (même si l'utilisateur peut refuser leur utilisation, ou bien lire leur contenu). Il faut éviter d'y stocker des mots de passe et leur attribuer un bref temps de vie sous peine de compromettre la vie privée de l'utilisateur.

Autre solution :

  • Une fois l'utilisateur connecté sur le site, lancer CURRENT_TIMESTAMP() et un ID au hasard ;
  • Définir un cookie avec cet ID ;
  • Quand l'utilisateur fait quelque chose qui nécessite de vérifier son identification :
SELECT FROM `access` WHERE `id`=id_cookie AND `timestamp`>=CURRENT_TIMESTAMP() - login_lifetime
  • Mettre à jour le timestamp.

Créer du contenu statique[modifier | modifier le wikicode]

Quand un utilisateur lit du contenu dynamique (d'une base), un document HTML est généré.

Souvent, cette page ne contient pas de variable mais du contenu inséré une seule fois, sans mise à jour.

D'où l'idée de stocker des pages HTML statiques, supprimée puis regénérées lors des mises à jour de la base.

PHP[modifier | modifier le wikicode]

Pilotes[modifier | modifier le wikicode]

PHP possède les pilotes officiels suivant pour MySQL :

  • mysql : ancien mais toujours utilisé dans les applications web ; c'est un module PHP procédural.
  • mysqli : plus rapide, peut être utilisé comme un ensemble de classes ou comme une bibliothèque procédurale.
  • PDO (PHP Data Objects) : utilise PDO, une couche abstraite pour interaction avec les bases, avec des pilotes pour MySQL et ODBC.
  • PDO_MYSQL : propose des fonctionnalités MySQL avancées, et les émulent si absentes.

Les fonctions de ces pilotes utilisent l'API C. Elles peuvent utiliser MySQL Client Library ou mysqlnd, comme pilotes natifs pour PHP.

Parfois, activer mysql et mysqli peut causer des problèmes. Il est donc préférable d'en activer qu'un.

De plus, PHP possède une extension ODBC qui fonctionne avec MySQL.

PEAR est un framework PHP important qui prend en charge MySQL.

register_globals et $_REQUEST[modifier | modifier le wikicode]

PHP a des variables d'environnement appelées register_globals. Depuis PHP 4.2, elles sont False par défaut, et ne doivent pas être activées. Dans PHP 5.3 la fonctionnalité est devenue obsolète et supprimée en PHP 5.4.0.

Cependant, si la version de PHP utilisée accepte register_globals, on peut vérifier s'il est activé lancer ini_get(). Si c'est le cas, ini_set() ne pourra pas le changer. Il y a deux façons de le faire :

  • Éditer php.ini.
  • Ajouter une ligne au .htaccess :
php_flag register_globals off

En fait si register_globals est True, un utilisateur peut arbitrairement ajouter des variables à votre script avec ce genre de commande :

your_script.php?new_variable=new_value

Ne jamais utiliser le tableau $_REQUEST, lui préférer :

  • $_ENV
  • $_GET
  • $_POST
  • $_COOKIE
  • $_SERVER

Cet ordre est celui suivi par PHP, mais il peut être modifié par variables_order.

Cela signifie que si votre script définit une variable serveur appelée "userid" et que l'application tente de la lire dans $_REQUEST, l'utilisateur peut prévenir en ajoutant une variable à la requête.