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