On Fri, 2006-07-14 at 09:47 -0300, Miles Thompson wrote:
> At 09:15 AM 7/14/2006, Jeremiah Foster wrote:
> >Nearly once or twice a day the mysql daemon on our FreeBSD server has to
> >be restarted since it is taking up most of the processor.
> >
> >That is about 3 hours and a billion rows examined. Is it likely that
> >this is the source of my problems?
> 
> I'd say YES. But first, how much time does it take if you remove the join 
> conditions for the LIKEs?

The time it takes after removing the two likes is 7 hours;

100 rows in set (7 hours 23 min 43.04 sec)

> There are two difficulties there:
>          1. Use of LIKE with wildcard search forces a table scan, although 
> see [1] below.
>          2. The two LIKEs are joined by an OR so
>                  Stdnsv will be scanned until the first condition is met, 
> and if it is fulfilled, then
>                  pl is scanned until the second condition is met. Full scan 
> on each table.
> 
>                  Alternately ...
> 
>                  If the first condition for Stdnsv is not met, then OR has 
> failed, but you will have a full table scan on the left hand side of the OR 
> regardless.
> 
> Second, have you indexes on the columns which are being compared?

Yes, I believe when I ran EXPLAIN it showed the tables were indexed. I
will run explain again to make sure.
> 
> Your memory usage is probably pretty high as well, as MySQL tries to do as 
> much work as it can in memory.

I will look into investing in more memory.
> 
> Have you tried this:
> 
> SELECT pp.art_num, pp.showprice as price, pc.custom_price,
>          pc.custom_name, pc.custom_delivery, pd.instock, Stdnsv.Description
> FROM product_tags pt, products_prices pp, products_dists pd,
>          filter_categories fc, product_linking pl, cds_Stdnsv Stdnsv
> WHERE
>          Stdnsv.ProdID = pp.art_num AND
>          pc.art_num = pp.art_num AND
>          pp.art_num = pl.art_num AND
>          pp.art_num = pd.art_num AND
>          fc.filter_type_id = 1 AND
>          fc.filter_id = pl.filter_id AND
>          (Stdnsv.Description != 'None' OR Stdnsv.Description != '')
> GROUP BY pp.art_num
> ORDER BY pp.showprice DESC LIMIT 100;
> 
> If that gives weird or unexpected results, try whacking off AND conditions 
> until it's fast, then think about why the query slows when they are 
> added.  Note the simple WHERE is an implicit LEFT JOIN.
> 
> Also formulate time query, and time it, with  " (Stdnsv.Description LIKE 
> '%Media%Center%' OR pl.art_num LIKE '%Media%
> Center%') " as the WHERE.
> 
> Apologies if this has been too pedantic.
> 
> Hope this is helpful - Miles Thompson

Miles, this has been extremely helpful, not at all pedantic. Thank you.
> 
> [1] MySQL 4.0 does another optimisation on LIKE. If you use ... LIKE 
> "%string%" and string is longer than 3 characters, MySQL will use the Turbo 
> Boyer-Moore algorithm to initialise the pattern for the string and then use 
> this pattern to perform the search quicker.
> This is taken from http://mysqld.active-venture.com/MySQL_indexes.html 



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

Reply via email to