50 000 enregistrements avec PHP MySql, extremement lent

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 : 50 000 enregistrements avec PHP MySql, extremement lent

par Ultiny » 16 avr. 2006, 03:48

Je répondais à ouckileou. C'est vrai en même temps j'ai 18 ans alors j'ai tout le temps d'apprendre plein de trucs :P

c'est bien d'aider

par daplus » 16 avr. 2006, 03:14

Bonsoir Ultiny

Le but de mes deux derniers messages était d'aider à la compréhension, en quelque sorte de payer ma dette à la communauté qu'il m'a si bien aidé, mais en aucun cas de pointer le doigt sur quiconque.

J'ai 57 ans et (comme l'a chanté Jean Gabin) "je sais que je ne sais pas".

Un dernier commentaire, ne t'excuse pas d'apprendre, fais en une force.

Quand à 27 ans, pendant un stage en Allemagne, un collègue m'a dit que je ne parlais pas très bien allemand, je lui ai répliqué (en allemand): "mais qu'est-ce je parle bien le français". Cela a clos la discussion avec ce collègue.

Bonne nuit

par Ultiny » 16 avr. 2006, 03:04

C'est moi?
Bah ouais :lol:

Il manque des trucs pour le LIKE non ?
J'en sais rien j'ai jamais utilisé LIKE de ma vie, j'ai fais que recopier son code et rajouté ce que je savais par rapport a AS, sinon désolé, j'ai tellement de trucs en cours : Modelisation Merise, MS SQL Server 2005, Oracle, PostgreSQL, MySQL5, AJAX, C/C++, CSS2, bref, je suis étudiant donc ça prends énormement de temps de bien connaitre tout ça :?

un dernier truc

par daplus » 16 avr. 2006, 03:01

Dans le LIKE '$name0' il faut que cette chaine inclue les % avant et après.

Comme ça: $name0 = '%'.strtoupper($name0).'%';

Encore merci à tous

100 fois plus rapide

par daplus » 16 avr. 2006, 01:58

C'était bien la bonne requëte.

Finalement j'appelle les deux tables l'une après l'autre.

Le résultat est environ 100 fois plus rapide, c'est presque immédiat.

Merci à tous et en particulier à Oucklileou pour m'avoir forcé à réflèchir après m'avoir montrer le chemin.

50 000 enregistrements

par daplus » 16 avr. 2006, 01:37

Bonsoir les courageux,

Je commence à avoir une piste avec
$result = mysql_query ("SELECT adr_id,adr_name1,adr_name2 FROM address WHERE UPPER(adr_name1) LIKE '$name0' || UPPER(adr_name2) LIKE '$name0'",$db); 
Pour moi au Canada c'est moins tard, mais pour les gens qui habitent la France ça commence à faire tard. Metrci encore.

par ouckileou » 16 avr. 2006, 00:28

C'est moi?
Bah ouais :lol:

Il manque des trucs pour le LIKE non ?

par Ultiny » 16 avr. 2006, 00:04

...et que quelqu'un choisisse de balancer du code même pas bon.
C'est moi?

par ouckileou » 15 avr. 2006, 23:49

J'adore passer un peu de temps à renvoyer vers le manuel, demander des éclaircissements, faire exprimer le problème clairement pour que la personne trouve elle-même...

...et que quelqu'un choisisse de balancer du code même pas bon.

](*,)
Est-ce que LIKE va faire une recherche de la chaine en m'importe quel endroit de la colonne, ou bien ne peut partir que de la première position de la colonne?
pour voir comment fonctionne LIKE : http://dev.mysql.com/doc/refman/5.0/fr/ ... ching.html

LIKE

par daplus » 15 avr. 2006, 23:41

Merci Ultiny,

Je vais essayer cette requête.

Merci à tous ceux qui m'ont apporté de nombreux éléments utiles.

Joyeuses Pâques

par Ultiny » 15 avr. 2006, 23:28

Par exemple : (je sais pas si c'est bon, c'est de mémoire)

Code : Tout sélectionner

SELECT a.adt_first, a.adt_last, a.adt_url, b.adr_name1, b.adr_name2 FROM adtel as a, address as b WHERE ( a.adt_first LIKE $chain || a.adt_last LIKE $chain || a.adt_url LIKE $chain || b.adr_name1 LIKE $chain || b.adr_name2 LIKE $chain);

ISAM

par daplus » 15 avr. 2006, 23:26

Merci CYrano,

Toiutes mes tables sont ISAM

par Cyrano » 15 avr. 2006, 23:01

Attention à un détail : l'index FULL TEXT ne fonctionne que sur des tables MyISAM, pas sur des tables InnoDB ;)

La requête MySQL à laquelle je pense

par daplus » 15 avr. 2006, 22:52

Merci ouckileou,

Voici l'information:

Recherche d'une chaine dans une partie des colonnes suivantes dans les tables suivantes

address.adr_name1
address.adr_name2
adtel.adt_first
adtel.adt_last
adtel.adt_url

SELECT adtel.adt_first,adtel.adt_last,adtel.adt_url,address.adr_name1,address.adr_name2 FROM adtel,address WHERE ( adt_first LIKE $chain || adt_last LIKE $chain || adt_url LIKE $chain || adr_name1 LIKE $chain || adr_name2 LIKE $chain);

Est-ce que LIKE va faire une recherche de la chaine en m'importe quel endroit de la colonne, ou bien ne peut partir que de la première position de la colonne?

Merci d'avance pour donner ton opinion

par ouckileou » 15 avr. 2006, 22:15

les INDEX servent à la recherche FULLTEXT par exemple

en fait, il faudrait que tu résumes ton problème, car je trouve que c'est fouilli :

sur quelles colonnes (ou champs c'est pareil) doivent porter ta recherche
à quoi ressemble l'expression recherchée : est-ce que tu as le nom exact ? est-ce que tu n'as que le début ?

De plus, tu parles de fichiers, mais dans une base de données ce sont de stables

Donc avant de te lancer dans le SQL, exprime clairement ton problème :
"qu'est-ce que je cherche, où je le cherche, quels éléments j'ai pour faire le tri"

Car tu reviens sur tes strpos et strtoupper mais ça c'est du PHP et c'est ça qui rend ta recherche très longue.
Nous pensons que ta recherche doit pouvoir se faire en entier dans MySQL, qui ne te renverre que les enregistrements qui correspondent à tes critères