JeuWeb - Crée ton jeu par navigateur
[SQL] couper une grosse table en plusieurs tables - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [SQL] couper une grosse table en plusieurs tables (/showthread.php?tid=4578)

Pages : 1 2 3


RE: [SQL] couper une grosse table en plusieurs tables - php_addict - 08-02-2010

salut

merci pour vos réponses ;-)


RE: [SQL] couper une grosse table en plusieurs tables - NicoMSEvent - 08-02-2010

il faut juste placer les bons index, et faire les bonens requetes (l'ordre dans lequel tu fais tes jointures, et dans lequel tu mets tes clauses WHERE ont beaucoup d'importance! je suis passé d'un temps d'exécution de 5 secondes pour afficher une portion de 30 cases à 0.05 sec juste en changeant l'ordre dont je viens de parler Smile


RE: [SQL] couper une grosse table en plusieurs tables - php_addict - 08-02-2010

je vais tester l'odre dans les WHERE mais j'ai fais quelques tests

personnellement je suis :

- à 0.087 sec pour 10x10
- à 0.29 sec pour 20x20
- à 1.85 sec pour 50x50
- à 6.90 sec pour 100x100

cela te semble correct ou encore optimisable?

je ne veux pas afficher 100x100 mais 6.9 sec me parait bien long ...

ta requete est elle dans un boucle genre for ($y = 0; $y <= 10; $y++) { for ($x = 0; $x <= 10; $x++) { ou fais tu autrement ?

utilises tu les requetes préparées, les vues ?

est ce que tu recupere coordonnée par coordonnée ou par ligne de coordonnées (WHERE x BETWEEN) ?

merci encore pour tes conseils Wink


RE: [SQL] couper une grosse table en plusieurs tables - Argorate - 08-02-2010

En théorie, si on a un bon SGBD il est censé s'occuper tout seul de faire les jointure avant les autres clauses WHERE (du moins c'est se qu'on nous a enseigné)
J'ai jamais essayé de voir si mysql était optimisable de se coté là, faudra que je test.

Mais 0.087 seconde pour 10*10 je trouve ça cher payé. Confused
Tu fais une seule grosse requête et tu travail dans un tableau après?

Sinon moi j'ai bien un while imbriqué...

C'est dur de dire si c'est optimisable sans connaitre le code, la bd, et le mecanisme que tu utilise ^^


RE: [SQL] couper une grosse table en plusieurs tables - NicoMSEvent - 08-02-2010

JAMAIS mettre une requete dans une boucle!!! :p
utilise un between! (moi j'utilise un IN, comme je n'utilise pas de vue "carrée", avec un masque qui me sort la forme que je veux)

tu peux poster des morceaux de code, et la structure de ta BDD, je pourrai analyser ça et p-e t'aiguiller vers une bonne solution Smile


RE: [SQL] couper une grosse table en plusieurs tables - Ter Rowan - 08-02-2010

je pense que ma méthode peut largement être optimisée, mais comme Nico, ne lance pas des requêtes en boucle

pour ma part j'utilise une boucle pour construire la requete (ce que je mets dans le "in")

et après seulement je lance la requête finalisée


RE: [SQL] couper une grosse table en plusieurs tables - NicoMSEvent - 08-02-2010

@Ter Rowan -> j'ai mon "masque" dans une table (genre : 0,0 représente la case ou le personnage est, -1,0 une case a coté, 0,+1 une case en dessous, etc...)
je fais une jointure comme ceci :
Code :
    $req_constr_plt='SELECT m.id '.
            'FROM monde m '. //les cases seront prises de cette table
            'JOIN mask_perso_view mpv ON 1=1 '. //La table de masque (je prends tout le masque -> 30 cases)
            'JOIN monde m_ori ON m_ori.id=\'%s\' '. //la case ou mon perso se trouve (je reprends les coordonnées en X et Y)
            'WHERE m.x=m_ori.x+mpv.x AND m.y=m_ori.y+mpv.y;'; --j'applique le masque a partir de la position de mon perso, sur la table contenant mon monde
Pour mes index, je n'en ai un que sur la coordonnée X de ma table "monde" (meilleur rapport performance/taille de la DB, j'ai fait plein de tests dessus, et je suis arrivé a cette conclusion étant donné que ma table contient plus de 500.000 lignes)


RE: [SQL] couper une grosse table en plusieurs tables - Ter Rowan - 08-02-2010

ah c'est pas mal comme technique

C'est limite plus "sexy" qu'un "in()"

par contre je me demandais (avant même ton exemple d'ailleurs) si il y a un intérêt à créer un id en plus des positions x y (voire z,t ,...) pour la table "carte"



id / x / y / type / ....

plutôt que

x / y / type / ....


dans les deux cas il faut je pense indexer sur x / y

mais quel est l'intérêt et l'utilisation de l'id ?


RE: [SQL] couper une grosse table en plusieurs tables - php_addict - 08-02-2010

(08-02-2010, 02:24 PM)Ter Rowan a écrit : par contre je me demandais (avant même ton exemple d'ailleurs) si il y a un intérêt à créer un id en plus des positions x y (voire z,t ,...) pour la table "carte"
mais quel est l'intérêt et l'utilisation de l'id ?

tu te sert de l'id ou pas?

pour ma part je le garde car il me sert dans:

- les parametres d'url (je trouve ca plus propre que de passer x et y)
- dans ma requete

Code :
query("SELECT c FROM map WHERE (x BETWEEN $debutx AND $finx) AND (y BETWEEN $debuty AND $finy) ORDER BY y ASC, id ASC")

avec mon between je suis obligé de trier les resultat par y et par id (ordre dans lequel les cases ont été crée, cela m'evite de trier par x et par y....)

faut que j'essaie avec un seul index pour voir...


RE: [SQL] couper une grosse table en plusieurs tables - NicoMSEvent - 08-02-2010

je me serts des ID pour stocker les positions des personnages (dans la table perso, j'ai l'ID de la case), les pnj, les magasins, les autes, ...

ce n'est certainement p-e pas la meilleure des solutions, mais pour l'instant ça me convient Wink

Dans mes URL, plutot que de dire : "je me déplace vers la case XYZ", je préfère dire "je vais vers le sud-ouest". Il y a moins de vérification point de vue possibilité de triche ^^