Absolutely was just going to suggest this Travis.

Another option and this is untested, but is to use HAVING and an alias.
Something to this effect...

SELECT INET_NTOA(e.src_ip) AS source_ip
WHERE e.timestamp BETWEEN '2010-10-11 00:00:00' AND '2010-10-12 00:00:00'
HAVING source_ip BETWEEN '10.0.0.0' and '10.255.255.255'

But yeah, Travis suggestion is cleaner and more efficient.

> -----Original Message-----
> From: Travis Ard [mailto:travis_...@hotmail.com] 
> Sent: Tuesday, October 12, 2010 9:51 AM
> To: 'Paul Halliday'
> Cc: mysql@lists.mysql.com
> Subject: RE: Can this be done with a single query?
> 
> You may get better performance from your query, and be able 
> to make better
> use of indexes if you use integer comparisons for your IP address
> expressions instead of converting to strings with pattern 
> matching.  You
> might consider something like the following:
> 
> 
> SELECT DISTINCT(e.src_ip) 
> FROM event e
> left outer join mappings m on mappings.src_ip = e.src_ip
> WHERE e.timestamp BETWEEN '2010-10-11 00:00:00' AND 
> '2010-10-12 00:00:00' 
> AND e.src_ip NOT BETWEEN 167772160 AND 184549375
> AND e.src_ip NOT BETWEEN 2886729728 AND 2886795263
> AND e.src_ip NOT BETWEEN 3232235520 AND 3232301055
> AND m.src_ip IS NULL;
> 
> -Travis
> 
> 
> -----Original Message-----
> From: Paul Halliday [mailto:paul.halli...@gmail.com] 
> Sent: Tuesday, October 12, 2010 10:08 AM
> To: Johnny Withers
> Cc: mysql@lists.mysql.com
> Subject: Re: Can this be done with a single query?
> 
> On Tue, Oct 12, 2010 at 11:14 AM, Johnny Withers
> <joh...@pixelated.net>wrote:
> 
> > I would try:
> >
> > SELECT DISTINCT(e.src_ip)
> > FROM event AS e
> > LEFT JOIN mappings AS m ON e.src_ip=m.src_ip
> > WHERE e.timestamp BETWEEN '2010-10-11 00:00:00' AND 
> '2010-10-12 00:00:00'
> >  AND INET_NTOA(e.src_ip) NOT LIKE '10.%.%.%'
> > AND INET_NTOA(e.src_ip) NOT LIKE '172.16.%.%'
> > AND INET_NTOA(e.src_ip) NOT LIKE '192.168.%.%'
> > AND m.src_ip IS NULL
> > ;
> >
> > I would also modify the where clause to use:
> >
> > AND src_ip NOT BETWEEN INET_ATON('10.0.0.0') AND 
> INET_ATON(10.255.255.255)
> > AND src_ip NOT BETWEEN INET_ATON('172.16.0.0') AND
> > INET_ATON(172.16.255.255)
> > AND src_ip NOT BETWEEN INET_ATON('192.168.0.0') AND
> > INET_ATON(192.168.255.255)
> >
> > instead of
> >
> > AND INET_NTOA(src_ip) NOT LIKE '10.%.%.%'
> > AND INET_NTOA(src_ip) NOT LIKE '172.16.%.%'
> > AND INET_NTOA(src_ip) NOT LIKE '192.168.%.%
> >
> > You should also ensure there is an index on src_ip in 
> events and mappings
> > tables.
> >
> > Using the INET_NTOA() function on the src_ip column will 
> prevent index
> > usage during the query.
> >
> 
> This and the suggestion by Nathan both work.
> 
> Thanks for the help!
> 
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    
> http://lists.mysql.com/mysql?unsub=dae...@daevid.com
> 


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to