Hi,

I would use a (source,stamp) index, and not a (stamp,source) index to
solve the performance problem.

  Jocelyn Fournier
  www.mesdiscussions.net

> Brian, can you post the output of EXPLAIN for your query?
> I.e.,
> EXPLAIN <problem query> ;
>
>
> At first glance, your query should be able to use the 'stamp-source'
> index since stamp is the first column indexed.  However, I wonder if
> wrapping the "NOW() - INTERVAL 14 DAY inside a "DATE()" would help.
> MySQL may be casting your table data to a DATETIME for comparison,
> which would be resource intensive.  Try this:
>
> stamp>=DATE(NOW()-interval 14 day)
>
> Your query will not be able to use the other index, 'country-source',
> because 'source' is the second column of the index and you are not
> querying against the 'country' column.  If you do not need 'country'
> to be the first column (do you have other queries that use this index
> and query against country?), you could redefine the index to put
> 'source' first.
>
> As Michael pointed out you could also create a separate index on just
> 'source'.  Or as brian suggests an index combining the two columns
> you're using here (I'd put 'source' first since you're doing a
> constant comparison with it).  However, more indices = more overhead,
> which is sometimes a problem, sometimes not.
>
> Dan
>
> On 1/8/07, Michael Gargiullo <[EMAIL PROTECTED]> wrote:
>>
>>
>> -----Original Message-----
>> From: Brian Dunning [mailto:[EMAIL PROTECTED]
>> Sent: Sunday, January 07, 2007 1:12 PM
>> To: mysql
>> Subject: Help optimizing this query?
>>
>> This is the query that's killing me in the slow query log, usually
>> taking around 20 seconds:
>>
>> select count(ip) as counted,stamp from ip_addr where stamp>=NOW()-
>> interval 14 day and source='sometext' group by stamp order by stamp
>> desc;
>>
>> Here is the table:
>>
>> CREATE TABLE `ip_addr` (
>>    `ip` int(10) unsigned NOT NULL default '0',
>>    `stamp` date NOT NULL default '0000-00-00',
>>    `country` char(2) NOT NULL default '',
>>    `source` varchar(20) NOT NULL default '',
>>    PRIMARY KEY  (`ip`),
>>    KEY `country-source` (`country`,`source`),
>>    KEY `stamp-source` (`stamp`,`source`)
>> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
>>
>> Any help please?   :)
>>
>> ---
>>
>> Just a thought? Put a normal index on source and another on stamp (not
>> combined).
>>
>>
>>
>>
>> --
>> MySQL General Mailing List
>> For list archives: http://lists.mysql.com/mysql
>> To unsubscribe:
>> http://lists.mysql.com/[EMAIL PROTECTED]
>>
>>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>
>


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to