[MySQL] Jointure, index et INET_ATON(), L'index n'est jamais utilisé

SuperCed

Membre expert
Club iGen
20 Juin 2001
1 333
70
45
superced.rb38.eu
Mon problème est le suivant, j'ai quelques tables qui contiennent dans leur champ, des IP.

Je fais des jointure entre ces tables, en faisant correspondre les IP. Pour comparer les IP, par exemple si je veux tester qu'une IP est bien dans une plage d'IP, j'utilise la fonction INET_ATON() qui transforme une IP en un entier sur 4 octets. En effet, comparer des chaînes contenant directement des IP ne fonctionne pas.

"19.4.2.1" est en effet plus GRAND que "182.4.2.1" si on compare lkes chaîne dans MySQL.

Par contre, avec INET_ATON(), plus de problème, INET_ATON(19.4.2.1) est bien plus PETIT que INET_ATON(182.4.2.1).

Donc j'ai plusieurs requêtes du type :
Bloc de code:
SELECT * FROM table1 t1
JOIN  table2 t2 ON (INET_ATON(t1.ip) BETWEEN INET_ATON(t2.ip_start) AND INET_ATON(t2.ip_stop));

La jointure se fait donc sur les champs INET_ATON(t1.ip), INET_ATON(t2.ip_start), et INET_ATON(t2.ip_stop).
Cette jointure n'utilise pas d'index, car il y a la fonction INET_ATON() qui transforme la valeur de la colonne.

D'autre part, je ne peux pas mettre en index une clef avec la fonction INET_ATON().

Ma requête est donc lente.

J'aimerais trouver un moyen d'accélérer considérablement cette requête.

Existe-il un moyen simple?

Merci!