This seems to be something, running it with a where
domain="somedomain.com" will use the domain index.  Well, I'll bring out
the gimp...

Full query:
SELECT *, access_log.domain as host_domain, access_log.server as server,
DATE_FORMAT(MIN(date),'%M %e, %Y %r') as disp_date, access_log.username
as user,
IF (LENGTH(referer) > 45, CONCAT(LEFT(referer, 42),"..."),referer) as
short_referer,
TIME_FORMAT(SEC_TO_TIME(TIME_TO_SEC(MAX(date)) - TIME_TO_SEC(MIN(date))
+ 30), "%i:%s") as time,
COUNT(access_log.url) as cnt, pIDlog_alerts.url as alert
FROM access_log
LEFT JOIN pIDlog_alerts ON access_log.url LIKE pIDlog_alerts.url
AND access_log.server = pIDlog_alerts.server
AND access_log.domain LIKE pIDlog_alerts.domain, pID_report_opt
WHERE host != ip
AND pID_report_opt.server = access_log.server
AND LOCATE("Mozilla",browser) > 0
AND LOCATE([*G_logtable*].domain,omit_domains) = 0
AND access_log.server = 'www.server.com'
AND (access_log.status = '304' || access_log.status = '200')
AND (filetype = "html" || filetype="pl" || filetype="mpls" ||
filetype="pdf" || filetype="shtml")
GROUP BY session_id
HAVING cnt > 1
ORDER BY date DESC
LIMIT 20

Explain output:

*************************** 1. row ***************************
        table: pID_report_opt
         type: ref
possible_keys: server
          key: server
      key_len: 51
          ref: const
         rows: 1
        Extra: where used; Using temporary; Using filesort
*************************** 2. row ***************************
        table: access_log
         type: ALL
possible_keys: filetype,status,server
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 592172
        Extra: where used
*************************** 3. row ***************************
        table: pIDlog_alerts
         type: ref
possible_keys: server
          key: server
      key_len: 53
          ref: access_log.server
         rows: 17
        Extra: 
3 rows in set (0.00 sec)

Now to me, the access_log table would be best with the file_type index.
Of the types selected, there are 155,983 records of the 592,341 total -
or 26%.  The order by with a goup by gets me a temp table, but if I
could kill the filesort that would be a lot better.

Also, maybe a multi field indexd would be great here, but I've neer had
much luck with those, and a few times I've had results returned that
were wrong with a multi column index on the table.

Thanks for looking at this,
Mike



-----Original Message-----
From: Christopher Thompson [mailto:[EMAIL PROTECTED]] 
Sent: Monday, March 25, 2002 3:13 PM
To: Michael C. Neel; [EMAIL PROTECTED]
Subject: Re: MySQL not using an index


What percentage of your database contains rows where status = 200?  It
looks 
to me like MySQL is estimating that perhaps 1/3 or more of the rows have
that 
status and therefore, it is faster to simply do a table scan rather than

using an index.

On Monday 25 March 2002 1:08 pm, Michael C. Neel wrote:
> I'm nearing the end of my rope trying to figure this one out.  I have 
> some queries run against a table that is a log of hits from a web 
> server.  No matter how simple I've tried to make my query, MySQL sill 
> does not choose an index.  Even use index has no effect.
>
> My table:
>
> CREATE TABLE access_log (
>   id bigint(20) unsigned NOT NULL auto_increment,
>   date datetime default NULL,
>   host varchar(255) default NULL,
>   domain varchar(255) default NULL,
>   ip varchar(255) default NULL,
>   method varchar(255) default NULL,
>   port smallint(6) default NULL,
>   url varchar(255) default NULL,
>   urlpath varchar(255) default NULL,
>   filepath varchar(255) default NULL,
>   filename varchar(255) default NULL,
>   filetype varchar(255) default NULL,
>   referer varchar(255) default NULL,
>   referer_domain varchar(255) default NULL,
>   referer_query varchar(255) default NULL,
>   browser varchar(255) default NULL,
>   status int(11) default NULL,
>   bytes int(11) default NULL,
>   server varchar(255) default NULL,
>   session_id varchar(255) default NULL,
>   user_id varchar(255) default NULL,
>   username varchar(255) default NULL,
>   query varchar(255) default NULL,
>   path_info varchar(255) default NULL,
>   request varchar(255) default NULL,
>   PRIMARY KEY  (id),
>   KEY domain (domain(10)),
>   KEY url (url(10)),
>   KEY filetype (filetype(5)),
>   KEY status (status),
>   KEY session_id (session_id(10)),
>   KEY user_id (user_id(10)),
>   KEY ip (ip(5)),
>   KEY host (host(5)),
>   KEY server (server(10))
> ) TYPE=MyISAM;
>
> The query:
>
> SELECT * FROM access_log WHERE status=200
>
> Gives this result in explain:
>
> *************************** 1. row ***************************
>         table: MEP_access_log
>          type: ALL
> possible_keys: status
>           key: NULL
>       key_len: NULL
>           ref: NULL
>          rows: 592042
>         Extra: where used
> 1 row in set (0.00 sec)
>
> I'm really running a much more complex query, but this simple one 
> doesn't use an index so I don't think my query is affecting the index 
> (again, I don't *think*).  I've run analyze table a few times, and 
> installed mysql 4.0.1-alpha (currently running 3.23.36), but with no 
> change.  Any idea or routes to look down would greatly help.
>
> Thanks,
> Mike
>
> ---------------------------------------------------------------------
> Before posting, please check:
>    http://www.mysql.com/manual.php   (the manual)
>    http://lists.mysql.com/           (the list archive)
>
> To request this thread, e-mail <[EMAIL PROTECTED]>
> To unsubscribe, e-mail 
> <[EMAIL PROTECTED]> Trouble 
> unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to