OVH Cloud OVH Cloud

[MySQL] temps de reponse beaucoup trop longs

1 réponse
Avatar
Erwann Thoraval
Bonjour,

Sous MySQL, je suis confronte a des temps de reponse aux requetes
beaucoup trop longs. Exemple : je dispose de 2 tables ja et zh dont le
contenu ressemble a ceci :

+-------------+-------------+
| id1 | id2 |
+-------------+-------------+
| jpn001\0002 | jpn001\0002 |
| jpn002\0050 | jpn001\0002 |
| jpn003\0001 | jpn001\0002 |
| jpn003\0168 | jpn001\0002 |
| jpn001\0003 | jpn001\0003 |
| jpn002\0052 | jpn001\0003 |
| jpn003\0003 | jpn001\0003 |
| jpn001\0004 | jpn001\0004 |
| jpn002\0053 | jpn001\0004 |
| jpn001\0005 | jpn001\0005 |
+-------------+-------------+

... mis a part qu'il y a environ 200 000 lignes dans chaque table.
(les champs sont des VARCHAR(20))

J'ai besoin de realiser une jointure entre ces deux tables. Je procede
de la maniere suivante :

SELECT * FROM ja j,zh z WHERE j.id2=z.id1;

Le temps de reponse a cette requete est de plusieurs heures ! (une bonne
dizaine)

J'ai donc essaye avec un nombre de lignes moins important : 10 000.

Avec 10 000 lignes, le temps de reponse est d'environ 3 minutes, ce qui est
bien evidemment trop long ! Pour donner un ordre d'idee, j'ai exporte
ces tables de 10 000 lignes dans des fichiers textes et j'ai lance une jointure
sous bash, a l'aide de la commande join :

$join -1 2 -2 1 table1 table2 > resultat

La commande s'execute en moins d'une seconde !

Je me suis alors dit que MySQL avait du mal a gere les chaines de caracteres,
alors j'ai essaye avec des SMALLINT. Le resultat est le meme...

Je ne suis pas du tout un specialiste de SQL, mais je ne comprends pas du tout
pourquoi ces temps de reponses sont si longs. Pourtant, une base de donnees
est sensee pouvoir gerer enormement d'entrees ? Je ne pense pas que 200 000
(et a fortiori 10 000) lignes lui posent probleme. Et pourtant...

Merci pour vos elements de reponse !

--
E. Thoraval

1 réponse

Avatar
Archives
Bonjour,

Vérifier d'abord que les champs id1 et id2 sont de même type et définis en
clé primaire (à champ unique).

Puis, simplifier la requête SQL en

SELECT * FROM ja INNER JOIN On ja.id1=zh.id2 LIMIT 10

Le résultat doit être immédiat.


"Erwann Thoraval" <xethora at atr dot jp> a écrit dans le message de news:

Bonjour,

Sous MySQL, je suis confronte a des temps de reponse aux requetes
beaucoup trop longs. Exemple : je dispose de 2 tables ja et zh dont le
contenu ressemble a ceci :

+-------------+-------------+
| id1 | id2 |
+-------------+-------------+
| jpn001002 | jpn001002 |
| jpn002050 | jpn001002 |
| jpn003001 | jpn001002 |
| jpn003168 | jpn001002 |
| jpn001003 | jpn001003 |
| jpn002052 | jpn001003 |
| jpn003003 | jpn001003 |
| jpn001004 | jpn001004 |
| jpn002053 | jpn001004 |
| jpn001005 | jpn001005 |
+-------------+-------------+

... mis a part qu'il y a environ 200 000 lignes dans chaque table.
(les champs sont des VARCHAR(20))

J'ai besoin de realiser une jointure entre ces deux tables. Je procede
de la maniere suivante :

SELECT * FROM ja j,zh z WHERE j.id2=z.id1;

Le temps de reponse a cette requete est de plusieurs heures ! (une bonne
dizaine)

J'ai donc essaye avec un nombre de lignes moins important : 10 000.

Avec 10 000 lignes, le temps de reponse est d'environ 3 minutes, ce qui


est
bien evidemment trop long ! Pour donner un ordre d'idee, j'ai exporte
ces tables de 10 000 lignes dans des fichiers textes et j'ai lance une


jointure
sous bash, a l'aide de la commande join :

$join -1 2 -2 1 table1 table2 > resultat

La commande s'execute en moins d'une seconde !

Je me suis alors dit que MySQL avait du mal a gere les chaines de


caracteres,
alors j'ai essaye avec des SMALLINT. Le resultat est le meme...

Je ne suis pas du tout un specialiste de SQL, mais je ne comprends pas du


tout
pourquoi ces temps de reponses sont si longs. Pourtant, une base de


donnees
est sensee pouvoir gerer enormement d'entrees ? Je ne pense pas que 200


000
(et a fortiori 10 000) lignes lui posent probleme. Et pourtant...

Merci pour vos elements de reponse !

--
E. Thoraval