jointure sur plusieurs bases

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : jointure sur plusieurs bases

Deuxième essai, mais même conclusion

par wozz » 11 août 2005, 13:26

Bonjour,

Effectivement lors du premier essai, les tables différaient de quelques enregistrements. Cette fois ce sont bien les mêmes.

J'ai ouvert et fermé la connexion pour chaque test et ajouter le terme "SQL_NO_CACHE" pour mes requêtes.

<?


// OUVERTURE CONNEXION
include "inc/confing.inc.php";

$total = microtime();

$query  = "SELECT SQL_NO_CACHE message_box.id_msg,  message.msg ";
$query .= "FROM message_box ";
$query .= "LEFT JOIN message ";
$query .= "ON message_box.id_msg = message.id_msg ";

$res = mysql_query($query);

echo microtime() - $total;

// FERMETURE CONNEXION
mysql_close();


echo "<br><br>";




// OUVERTURE CONNEXION
include "inc/confing.inc.php";

$total = microtime();

$query  = "SELECT SQL_NO_CACHE bd2.message_box.id_msg, bd1.message.msg  ";
$query .= "FROM bd2.message_box ";
$query .= "LEFT JOIN bd1.message ";
$query .= "ON bd2.message_box.id_msg =  bd1.message.id_msg ";

$res = mysql_query($query);

echo microtime() - $total;

// FERMETURE CONNEXION
mysql_close();


?>

Résultats obtenus. Je donne ci-dessous le lancement du scripts 3 fois.


Avec tables dans même base
essai1 : 0.00036600000000001
essai2 : 0.00025800000000001
essai3 : 0.00024000000000002

Avec tables sur bases différentes
essai1 : 0.00020700000000001
essai2 : 0.00021400000000002
essai3 : 0.00021599999999999


Il apparait donc que cela est plus rapide lorsque les données sont sur des bases différentes.

Pourquoi a-t-on des résultats si différents ? Si tu trouves une explication je suis preneur ;)

Mes tables sont indexées sur un seul champ, celui de la jointure.


Bref pour moi ces résultats son encourageants car je pense que je ne modifierai pas mes scripts en vain pour aller chez mon nouvel hébergeur, qui je le rappelle, m'interdit d'avoir des bases de plus 50Mo sous peine de me mettre sur un autre serveur MySQL plus lent selon lui.



Merci


Cette fois j'ai balisé directement mon PHP, je suis un garçon sage :D

par Ripat » 10 août 2005, 12:02

J'ai été surpris par tes résultats et j'ai donc fait un test sur ma machine (select/jointure d'une table de 800.000 lignes sur une table de 50.000 lignes).

Si les deux tables se trouvent dans la même bdd, la requête est environ 40% plus rapide.

J'ai pris la précaution de fermer la connexion au serveur MySQL entre chaque test et d'utiliser mysql_connect() plutôt que mysql_pconnect()

De plus j'ai désactivé le cache de MySQL en ajoutant SQL_NO_CACHE au SELECT (SELECT SQL_NO_CACHE db1.table1.col, db2.table2.col ....)

Je suppose que tu as bien vérifié que tes deux requêtes te renvoient bien le même résultat et que le serveur MySQL ne te retourne aucune erreur.

Est-ce normal ?

par wozz » 10 août 2005, 10:35

Bonjour,

Je souhaite moi aussi répartir mes données en plusieurs bases, en partie du fait que mon hébergeur me le demande.

J'ai fait le test suivant :

<?

include "inc/confing.inc.php";

$total = microtime();

$query  = "SELECT message_box.id_msg,  message.msg ";
$query .= "FROM message_box ";
$query .= "LEFT JOIN message ";
$query .= "ON message_box.id_msg = message.id_msg ";
$query .= "WHERE message_box.id_membre = 1";

$res = mysql_query($query);

echo microtime() - $total;


echo "<br><br>";



$total = microtime();

$query  = "SELECT base2.message_box.id_msg, base1.message.msg  ";
$query .= "FROM base2.message_box ";
$query .= "LEFT JOIN base1.message ";
$query .= "ON base2.message_box.id_msg =  base1.message.id_msg ";
$query .= "WHERE base2.message_box.id_membre = 1 ";

$res = mysql_query($query);

echo microtime() - $total;


?>


Le premier essai avec les 2 tables sur la même base me retourne
0.005699 (microseconde surement)

Le deuxième essai avec les 2 tables sur 2 bases différentes me retourne
0.001442 (microseconde surement)


Apparemment le fait d'avoir les fichiers sur 2 bases différentes irait plus vite. C'est bien normal ? Mon exemple est-il valide ?


Merci

edit mere-teresa : les balises PHP sont faites pour colorer le code et épargner les yeux (et le temps) des gentils membres du forum qui veulent t'aider. Merci de les utiliser.

par zeus » 29 juil. 2005, 11:21

LE cache et les jointures sont dans le dossier mysql donc les acces sont équivalent pour toutes les bdd

par pjl » 29 juil. 2005, 10:25

justement, c'est le fait que ce soit dans des dossiers différents qui me fait penser celà.

par julien » 29 juil. 2005, 09:57

Merci,

C'est vrai que comme le dit Zeus, les fichiers sont au même niveau.
Par contre je ne savais pas trop comment MySQL gère les requêtes sur plusieurs bases (cache, verrouillage des fichiers...)

par zeus » 28 juil. 2005, 17:06

Si tu regarde en bas niveau, les fichiers sont au même endroits, juste dans un dossier différent

par pjl » 28 juil. 2005, 17:05

coté performance, j'ai un doute quand même.

par zeus » 28 juil. 2005, 16:38

pour la possibilité, je dit oui, en mySQL
pour les performances, je dit : aucune idée, mais je pense que ça doit être sensiblement la même chose que une jointure sur une seule bdd

La syntaxe est la suivante
bdd1
-- table1
--champ1

bdd2
-- table2
-- champ2

jointure entre table1 et table2

Code : Tout sélectionner

SELECT * FROM bdd1.table1 JOIN bdd2.table2 ON bdd1.table1.champ1=bdd2.table2.champ2
Voilà

jointure sur plusieurs bases

par julien » 28 juil. 2005, 16:34

Bonjour,

Juste une petite question pour savoir si les jointures sur des tables de bases de données différentes (mais sur le même serveur) étaient faisables et si oui ce que ca donne niveau performance par rapport à des tables dans la même base de données.

Merci à tous.