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]