Re: Limit the results of a COUNT

2007-12-31 Thread Perrin Harkins
On Dec 31, 2007 3:05 PM, donr2020 <[EMAIL PROTECTED]> wrote:
> Sorry, I didn't type the subqueries quite correctly. They all have the same
> WHERE part (in this case, "WHERE Col1 = X" that essentially "joins" all the
> queries.

It still doesn't make sense to me.  Count queries don't return
anything to join.  If all you want is to have them in the same result
set, you can use subqueries for that, e.g.

SELECT (SELECT COUNT(*) FROM x) AS x_count,
  (SELECT COUNT(*) FROM y) AS y_count, etc.

> There are six counts that we need and we first tested it as seven separate
> queries; but that took about 20% longer than one nested set of queries, as
> there is a little overhead for each query.

The overhead of a half-dozen queries shouldn't add up to much with an
efficient client library.  I think you'd be better off avoiding this
complication.  At the very least, I'd avoid joining things that can't
be joined.

> Your suggestion does help somewhat. Changing the subqueries to a count of
> limited subqueries reduced a large sample query from 9 seconds down to 5
> seconds. We need to get this down some more to about 1 or 2 seconds (or less
> if possible).

If LIMIT helps, it probably means you either have a table scan or a
subquery that runs separately for every row.  Finding a way to improve
the use of indexing is your best bet for making a big change.  Or some
kind of caching scheme.  Incidentally, using separate queries would
probably increase the chance of hitting the MySQL result cache for
some of them.

- Perrin

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



Re: Limit the results of a COUNT

2007-12-31 Thread donr2020

Sorry, I didn't type the subqueries quite correctly. They all have the same
WHERE part (in this case, "WHERE Col1 = X" that essentially "joins" all the
queries.

There are six counts that we need and we first tested it as seven separate
queries; but that took about 20% longer than one nested set of queries, as
there is a little overhead for each query.

Your suggestion does help somewhat. Changing the subqueries to a count of
limited subqueries reduced a large sample query from 9 seconds down to 5
seconds. We need to get this down some more to about 1 or 2 seconds (or less
if possible).

We're going to try using VIEW's to see if that helps. Any other thoughts
would be appreciated.

Best,

Don



Perrin Harkins wrote:
> 
> On Dec 30, 2007 1:50 PM, donr2020 <[EMAIL PROTECTED]> wrote:
>> Our search engine does a master query INNER JOINed to a series of COUNT
>> (*)
>> subqueries that return what the number of results would have been had the
>> user chosen different "filters" (or no filter at all). As an example:
> 
> Hmm.  Why are you joining these?  There's nothing to join.  It looks
> like these should be separate queries.
> 
>> This query is being run against a database that currently as 100 Million
>> records (and rapidly growing), and if TotCount is over about 50,000, the
>> query is unacceptably slow. We need to LIMIT the subqueries to some
>> maximum
>> count (stop counting at, say, 50,000). Does anyone know a way to do this?
> 
> You can use a temp table, view, or subquery to do it.  For example:
> 
> SELECT COUNT(*) FROM
>   (SELECT id FROM table LIMIT 5) AS limited_table
> 
> I'm not sure this will actually be faster though.
> 
> - Perrin
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Limit-the-results-of-a-COUNT-tp14549988p14561532.html
Sent from the MySQL - General mailing list archive at Nabble.com.


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



Re: Sorting Tables

2007-12-31 Thread mos

At 12:51 PM 12/31/2007, you wrote:

Hi;
Is it possible to sort tables within a given database? How?
TIA,
Victor


Victor,
 You mean physically sort the table based on a field or key so you 
don't have to do an Order By clause each time you do a Select? Not really 
because the order of the table is expected to be random unless you 
specify  an Order by clause.  The only thing I can think of is to create a 
new table, maybe temporary or Memory table and copy the data into it 
already sorted.


drop table if exists newtable;
create newtable like oldtable;
insert into newtable select * from oldtable order by col1, col2;

Now you should be able to

Select * from NewTable;

without sorting (if you don't update it). The order should be by col1,col2. 
(No guarantee)


If you want to sort it in order to speed it up, then run an Optimize on the 
table.


Mike 


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



Re: Limit the results of a COUNT

2007-12-31 Thread Perrin Harkins
On Dec 30, 2007 1:50 PM, donr2020 <[EMAIL PROTECTED]> wrote:
> Our search engine does a master query INNER JOINed to a series of COUNT (*)
> subqueries that return what the number of results would have been had the
> user chosen different "filters" (or no filter at all). As an example:

Hmm.  Why are you joining these?  There's nothing to join.  It looks
like these should be separate queries.

> This query is being run against a database that currently as 100 Million
> records (and rapidly growing), and if TotCount is over about 50,000, the
> query is unacceptably slow. We need to LIMIT the subqueries to some maximum
> count (stop counting at, say, 50,000). Does anyone know a way to do this?

You can use a temp table, view, or subquery to do it.  For example:

SELECT COUNT(*) FROM
  (SELECT id FROM table LIMIT 5) AS limited_table

I'm not sure this will actually be faster though.

- Perrin

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



Re: Spawning Tables

2007-12-31 Thread Victor Subervi
Done. Thanks ;)

On Dec 28, 2007 1:41 PM, J Trahair <[EMAIL PROTECTED]> wrote:

> In my experience, having a limit of a particular number of anythings per
> something, eg. components per compound word is always a mistake, whether
> it's the number of payments allowed to pay an invoice, the number of
> children per parent, the number of cars per family, pets per owner, etc.
> There's always one that has one too many. And lots of them have only one or
> two. Go for the 'mini'-table.
>
> Jonathan Trahair
>   I'm going to build a translation s/w and I'd like some advice. Many
>  languages have compound words. I'd like to build a table that shows the
>  component words. However, it depends on the compound word as to how many
>  components it has! Now, I could take a "safe" guess and limit it to, say,
> 4
>  words. But then I'm wasting a lot of storage. So I thought I'd spawn a
>  mini-table for each compound word. Is that the best way to handle this?
>  TIA,
>  Victor
>


Mysql 4.0 Adding fields to large tables

2007-12-31 Thread James Sherwood

Hello all,

I am trying to add a field to a very large table.  The problem is that mysql 
locks up when trying to do so.  I even tried deleting the foreign keys on 
the table and it wont even let me do that, again locking up.


It works for around 5 minutes or so then just either locks or the database 
dies and I have to restart it.


Any ideas how to do this?

Thanks,
James 



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