IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

L'accès a mes données SQL rame !


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut L'accès a mes données SQL rame !
    Bonjour

    Je viens vers vous car j'ai un probleme c'est temps ci. J'ai une table SQL trés grosse et l'accés a mes données prennent 20 secondes ...

    La requete en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req2=mysql_query("SELECT id,country,place,gps,type,longueur,niveau,duree,vu FROM places WHERE assoc='0' AND status<5 AND country IN ('FR','ES','IT','GB') ORDER BY vu DESC LIMIT 100");

    Ma table "places" fait 568 214 enregistrement soit 146 Mo


    Voici la structure de ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    1	id	        int(10)			                        Non 	Aucune	AUTO_INCREMENT
    2	country	varchar(5)	        utf8_general_ci		Non 	Aucune	
    3	place	        varchar(250)	utf8_general_ci		Non 	Aucune	
    4	gps	        varchar(250)	utf8_general_ci		Oui 	NULL		
    5	localisor	int(10)			                        Non 	0		
    6	type	        varchar(250)	utf8_general_ci		Oui 	NULL		
    7	vu	        int(10)			                        Non 	0		
    8	date_add	datetime			                        Non 	Aucune	
    9	i_custom	text	                utf8_general_ci		Oui 	NULL		
    10	i_wiki 	text	                utf8_general_ci		Oui 	NULL		
    11	i_routard	text	                utf8_general_ci		Oui 	NULL		
    12	i_fute	        text	                utf8_general_ci		Oui 	NULL		
    13	population	int(10)			                        Oui 	NULL		
    14	surface	int(10)			                        Oui 	NULL		
    15	acces	        varchar(250)	utf8_general_ci		Oui 	NULL	
    16	acces1	text	                utf8_general_ci		Oui 	NULL		
    17	duree	        varchar(250)	utf8_general_ci		Oui 	NULL	
    18	longueur	varchar(250)	utf8_general_ci		Oui 	NULL	
    19	niveau	varchar(250)	utf8_general_ci		Oui 	NULL		
    20	circuit	longtext	        utf8_general_ci		Oui 	NULL		
    21	contributor	int(10)			                        Oui 	NULL		
    22	assoc	        int(10)			                        Non 	0		
    23	status	int(1)			                                Non 	0


    Voici un exemple d'enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    579070 	ES 	Requena Casa Medina Requena 	39.484306,-1.098479 	0 	vtt 	0 	2015-07-03 18:07:59 	larga y dura	NULL	NULL	NULL	NULL	NULL	NULL	NULL	2h48 	43,31 	3 	NULL	NULL	0 	0



    Si quelqu'un sait ce qui fait ramer et comment y remédier .....
    Merci par avance

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 090
    Points
    43 090
    Par défaut
    Pour commencer, ta base est-elle indexée ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Le champ id est en PRIMARY KEY
    J'ai rajouté un index sur le champ "country" pour voir, mais ça ne change rien

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 090
    Points
    43 090
    Par défaut
    Essayes d'ajouter des index sur assoc et status
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Salut,

    Tu dois commencer par créer un ou plusieurs indexes sur ta table et ensuite ajuster ta requête en fonction de l'indexe.
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    MySQL est un langage de programmation qu'il faut apprendre au même niveau que PHP (voire plus, puisque c'est le facteur principal de ralentissement des sites).

    Lis le tutorial que tout développeur doit lire: Sers-toi de l'index, Luke!

    C'est la réponse à toutes tes questions!

  7. #7
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par Tsilefy Voir le message
    MySQL est un langage de programmation
    Depuis quand ?
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Citation Envoyé par Thes32 Voir le message
    Depuis quand ?
    Je voulais dire SQL :-)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    J'ai testé avec des index, ça change rien ....
    Par contre j'ai remarqué un truc : depuis mon site cette requete met 20/30 secondes a s'exécuter alors que depuis phpMyAdmin ça met 0.60sec

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Est-ce vraiment la requête qui met 20 secondes ? ou est-ce l'intégralité du script ?

    Et sinon pour les indexes, personnellement, je mettrais un index sur assoc, status et country (un seul index comprenant les 3 colonnes)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Celira Voir le message
    Est-ce vraiment la requête qui met 20 secondes ? ou est-ce l'intégralité du script ?

    Et sinon pour les indexes, personnellement, je mettrais un index sur assoc, status et country (un seul index comprenant les 3 colonnes)

    Salut. Merci pour ta réponse.
    J'ai testé de mettre un index comprenant les 3 colonnes, ça ne change rien à la vitesse d'exécution ...

    Et oui c'est vraiment la requete qui met 20 secondes... J'ai utilisé la fonction PHP getmicrotime() (une fonction trouvable sur le net) que j'ai mise juste avant et juste aprés la requete mysql_query() et c'est ce résultat qui me met 20 secondes :/

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    À moins que phpMyAdmin ne cache les résultats, c'est très étrange. Est-ce que tu as un accès console à ta machine? Si oui, fais ta requête à partir de la ligne de commande pour voir.

    Fais un EXPLAIN sur ta requête et regarde quels index (et dans quel ordre) sont utilisés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXPLAIN SELECT id,country,place,gps,type,longueur,niveau,duree,vu FROM places WHERE assoc='0' AND status<5 AND country IN ('FR','ES','IT','GB') ORDER BY vu DESC LIMIT 100

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Tsilefy Voir le message
    À moins que phpMyAdmin ne cache les résultats, c'est très étrange. Est-ce que tu as un accès console à ta machine? Si oui, fais ta requête à partir de la ligne de commande pour voir.

    Fais un EXPLAIN sur ta requête et regarde quels index (et dans quel ordre) sont utilisés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXPLAIN SELECT id,country,place,gps,type,longueur,niveau,duree,vu FROM places WHERE assoc='0' AND status<5 AND country IN ('FR','ES','IT','GB') ORDER BY vu DESC LIMIT 100


    J'ai fais la requete depuis PhpMyAdmin voici la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
    1 	SIMPLE 	places 	range 	country 	country 	25 	NULL	329844 	Using where; Using filesort

  14. #14
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Vu le résultat de la commande EXPLAIN, tu n'as pas du tout suivi le conseil :
    Citation Envoyé par Celira Voir le message
    Et sinon pour les indexes, personnellement, je mettrais un index sur assoc, status et country (un seul index comprenant les 3 colonnes)
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Thes32 Voir le message
    Vu le résultat de la commande EXPLAIN, tu n'as pas du tout suivi le conseil :

    Quand j'ai fais cette requete il y avait (d'ailleurs il y a toujours) un index englobant ces 3 champs + un index sur id (UNIQUE)

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Peux-tu poster la partie de ton script qui traite de la requête, stp?

    Poste également la structure complète de la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE TABLE places;

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Salut

    Pour la requete c'est inutile : j'ai mis le "chronomètre" autour de la fonction mysql_query() uniquement. Mais bon je la poste quand meme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($data2=mysql_fetch_array($req2)) {
    	array_push($prox,strlen(round($data2['distanceee'])).'||'.round($data2['distanceee']).'||'.$data2['country'].'||'.$data2['place'].'||'.$data2['type'].'||'.$data2['longueur'].'||'.$data2['niveau'].'||'.$data2['duree'].'||'.$data2['id']);
    }
    SHOW CREATE TABLE places; donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    CREATE TABLE `places` (
     `id` int(10) NOT NULL AUTO_INCREMENT,
     `country` varchar(5) NOT NULL,
     `place` varchar(250) NOT NULL,
     `gps` varchar(250) DEFAULT NULL,
     `localisor` int(10) NOT NULL DEFAULT '0',
     `type` varchar(250) DEFAULT NULL,
     `vu` int(10) NOT NULL DEFAULT '0',
     `date_add` datetime NOT NULL,
     `i_custom` text,
     `i_wiki` text,
     `i_routard` text,
     `i_fute` text,
     `population` int(10) DEFAULT NULL,
     `surface` int(10) DEFAULT NULL,
     `acces` varchar(250) DEFAULT NULL,
     `acces1` text,
     `duree` varchar(250) DEFAULT NULL,
     `longueur` varchar(250) DEFAULT NULL,
     `niveau` varchar(250) DEFAULT NULL,
     `circuit` longtext,
     `contributor` int(10) DEFAULT NULL,
     `assoc` int(10) NOT NULL DEFAULT '0',
     `status` int(1) NOT NULL DEFAULT '0',
     PRIMARY KEY (`id`),
     KEY `country` (`country`,`assoc`,`status`)
    ) ENGINE=MyISAM AUTO_INCREMENT=670770 DEFAULT CHARSET=utf8

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Est ce qu'il existe des outils de testage d'un site ? Qui détecteraient la source d'une lenteur par exemple.

Discussions similaires

  1. Problème acces à base de données SQL Server
    Par Senynium X dans le forum ASP.NET
    Réponses: 3
    Dernier message: 29/05/2009, 14h47
  2. Sécurisé l'acces base de données Sql Server
    Par oclone dans le forum Sécurité
    Réponses: 1
    Dernier message: 02/11/2008, 22h04
  3. Réponses: 6
    Dernier message: 22/09/2006, 10h50
  4. [VB]accès au données sql server
    Par yaobi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/02/2006, 18h04
  5. Accès à une base de données SQL serveur
    Par TALNA dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/11/2005, 09h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo