5 votes

Mysql select on indexded column slowdown on large tables

J'ai deux tables : A - 301 colonnes ( 1ère nommée a1 int(11) Primary Key, 2ème à 301ème - double(15,11) ) & B - 33 colonnes ( 1ère - b1 int(11) Unique Key, 2ème - b2 varchar(100) Primary Key, .... , 33ème - b33 int(11) MUL ).

A et B ont tous les deux ~ 13.500.000 enregistrements.

Ma requête mysql : Pour chaque valeur de pos, avec pos dans l'ensemble (1, 1000, 2000, ..., 13500000) en multiples de 1000 :

sélectionner A.*, b2, b5, b7, b8, b10, b13, b33 de A joindre B sur a1=b1 où b33 >= pos et b33 < pos+1000 ;

La requête prend 1 à 5 secondes pour des valeurs de b33 <= 600 000. Après cela, la requête prend 20 à 30 secondes. Lorsque b33 >= 8,000,000 la requête commence à prendre 60-70s. Je ne comprends pas pourquoi le ralentissement se produit. b33 est indexé et la jointure a lieu sur la clé qui est définie comme primaire dans une table et unique dans l'autre. Existe-t-il une solution de contournement pour cela ? Cela nuit vraiment à la vitesse du code et je vais devoir diviser les tables A et B en plusieurs petites tables si rien d'autre ne fonctionne. J'espère vraiment ne pas avoir à le faire ! Aidez-moi, s'il vous plaît !

EDIT : Voici l'o/p de EXPLAIN -

** * ** * ** * ** * * 1. rangée * ** * ** * ** * ** *
id : 1
select_type : SIMPLE
table : B
type : gamme
clés_possibles : b1,b33
clé : b33
key_len : 4
ref : NULL
rangs : 981
Extra : Utiliser où
* ** * ** * ** * ** * 2. rangée * ** * ** * ** * ** *
id : 1
select_type : SIMPLE
table : A
type : eq_ref
clés possibles : PRIMAIRE
clé : PRIMAIRE
key_len : 4
réf : DBName.B.b1
rangs : 1
Extra :
2 rangs en série (0.00 sec)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X