LEFT JOIN on BETWEEN not using indexes
Overlapping ranges is an especially difficult problem to optimize.  However, here is a technique that provides significant performance, but it requires major change to the schema.

Add another table; let's call it Prefixes.  It contains two columns:

prefix DECIMAL(4,0) NOT NULL,
range_id INT,   -- for JOINing to `ranges`
PRIMARY KEY(prefix)


Then, to look for the number 4432109..., first look up 4432 in Prefixes.  This will lead to one or morerange.id` values for checking in your existing table.

Note that, for your example, there will 100 entries in Prefixes for 'UK' and 10 entries for 'UK Vodafone'.  This implies extra code to maintain Prefixes.

A variant on this is to move the rest of the ranges columns into my new table, and get rid of the table ranges.  (Whether to do this depends on the number and nature of the columns, the hassle in the code, the size of the 'prefix', the size of the table(s), etc, etc.)