[Asterisk-Users] mysql phone number pattern match query

Simone Cittadini mymailforlists at gmail.com
Thu Feb 23 03:27:59 MST 2006


>
>
>  
>
> I am not a mySQL expert (obviously), my limited SQL experience is with 
> MS SQL where stored procedures and views are an option.
>
>  
>
> This is with mySQL 4.x, so no views.
>
I'm no an expert too, but even if the algorithm is right and seems to 
bring some optimization I think mysql way of do things can't leverage 
such a method

> Select dialpattern from rates where left 5 match left 5 of dst
>
this is a select of a substring, I don't think mysql can index a 
substring, so the query will be redone completely every time

> Order by length of dialpattern, descending
>
I'm pretty sure mysql isn't so good at sorting, you're wasting a little 
more time

> Compare dialpattern to the first x number of digits from dst where x = 
> the length of dial pattern
>
here you have another substring

> The first match (when ordered by length descending) is the correct 
> result (longest match)
>
>  
>
Now of course the performance issue is relative since we are searching 
between two little strings and not for some book with 'asterisk' and 
'future' in the title on amazon.
Since performance isn't probably an issue I suggest a simple

price = None
for (i=1, i++, i<len(dialstring))
    price = select price from rates where prefix = 
dialstring[0:len(dialstring)-i]
    if price != None break
if price == None we don't know how to bill this call
else do stuff

you have an O(len(dialstring)) search but the code is simple and cpus 
are fast

If you know your system will never call numbers shorter than m you can 
substitue len(dialstring) with len(dialstring)-m

If performance is an issue maybe (never tried myself) you can split the 
prefixes table in one table for the first 4 chars, like

0011 America1
0012 America2
...
0020 Egypt
...
0086 China
...


and one table for every destination with the remaining part of the code, 
so you
first do a select on the first 4 chars of the dialed number, you know 
you'll always have one and only one match.
the match is the name of the table where to do the O(n) search, but now 
n is even smaller and there is also a smaller  number of rows to search 
from.
(too bad international prefixes aren't all of the same length, so the 
numbers in the tables have less sense and you probably need a little 
more complex billing application)

If you need to investigate what is the better query use EXPLAIN in front 
of them, and look at how mysql will do the query, what index uses and 
how many lines will it go through ....




More information about the asterisk-users mailing list