Re: Optimizing GROUP BY and ORDER BY

2008-07-25 Thread Michael Stearne
On Fri, Jul 25, 2008 at 12:35 PM, Arthur Fuller <[EMAIL PROTECTED]> wrote:
> ORDER BY implies a sort of the result set. I don't think there is any way
> around that.

I guess so. What I am doing is to just run the query once per day and
store the results in memcache.

Michael


>
> Arthur
>
> On Fri, Jul 25, 2008 at 4:27 AM, Michael Stearne <[EMAIL PROTECTED]>
> wrote:
>>
>> I have a query:
>>
>> SELECT Country, COUNT( Country ) AS Cnt FROM properties WHERE (
>> Country != 'USA' AND Country != 'US' AND Country != 'Unit' AND Country
>> != 'United States' AND Country != ' ' AND Country IS NOT NULL ) GROUP
>> BY Country ORDER BY Cnt DESC LIMIT 8
>>
>> that gets the top 8 non-US countries from the properties table. There
>> is about 500,000 rows in the properties table.
>>
>> This is a costly query:
>>
>> ++-++---+---+-+-+--+---+---+
>> | id | select_type | table  | type  | possible_keys | key |
>> key_len | ref  | rows  | Extra
>>|
>>
>> ++-++---+---+-+-+--+---+---+
>> |  1 | SIMPLE  | properties | range | Country   | Country | 7
>> | NULL | 74602 | Using where; Using index; Using temporary; Using
>> filesort |
>>
>> ++-++---+---+-+-+--+---+---+
>> 1 row in set (0.00 sec)
>
>

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



Re: Optimizing GROUP BY and ORDER BY

2008-07-25 Thread Rob Wultsch
On Fri, Jul 25, 2008 at 12:27 AM, Michael Stearne <[EMAIL PROTECTED]> wrote:
> I have a query:
>
> SELECT Country, COUNT( Country ) AS Cnt
> FROM properties WHERE (
>   Country != 'USA' AND
>   Country != 'US' AND
>   Country != 'Unit' AND
>   Country != 'United States'
>   AND Country != ' '
>   AND Country IS NOT NULL )
> GROUP BY Country
> ORDER BY Cnt
> DESC LIMIT
>
> This is a costly query

I suggest that this is not a well normalized. I suggest that at a
minium you should be using a 'Country' which would include a distinct
entry for each country.

If such a table exists a column could be added which would store a
count of number of rows in the Properties table that reference the
record in the Country table. This count could be maintained through
your application, or via triggers if you are using MySQL 5.0 > .

-- 
Rob Wultsch

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



Optimizing GROUP BY and ORDER BY

2008-07-25 Thread Michael Stearne
I have a query:

SELECT Country, COUNT( Country ) AS Cnt FROM properties WHERE (
Country != 'USA' AND Country != 'US' AND Country != 'Unit' AND Country
!= 'United States' AND Country != ' ' AND Country IS NOT NULL ) GROUP
BY Country ORDER BY Cnt DESC LIMIT 8

that gets the top 8 non-US countries from the properties table. There
is about 500,000 rows in the properties table.

This is a costly query:
++-++---+---+-+-+--+---+---+
| id | select_type | table  | type  | possible_keys | key |
key_len | ref  | rows  | Extra
|
++-++---+---+-+-+--+---+---+
|  1 | SIMPLE  | properties | range | Country   | Country | 7
 | NULL | 74602 | Using where; Using index; Using temporary; Using
filesort |
++-++---+---+-+-+--+---+---+
1 row in set (0.00 sec)

Any ideas on how to get rid of the "Using temporary; Using filesort"
or do this in a better way with PHP?

Thanks!
Michael

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



Re: Optimizing GROUP BY

2005-10-13 Thread Kishore Jalleda
That was an excellent reply, I always see you helping so many people, keep
the great work going ..
 Sincerely,
Kishore Jalleda

 On 10/13/05, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
>
>
> Kishore Jalleda <[EMAIL PROTECTED]> wrote on 10/13/2005 02:25:52 PM:
>
> > Hi All,
> > I have a query which takes approximately 0.5 seconds to execute , it is
> as
> > follows
> > SELECT gamename, MAX(score) AS score, COUNT(valid=1) AS played FROM
> > gamesessions AS gamesessions
> > WHERE valid=1 AND sessiontype IN (1,2)
> > GROUP BY gamename;
> > EXPLAIN SELECT gives me this, also there is an index on the columns
> valid
> > and sessiontype
> > id select_type table type possible_keys key key_len ref rows Extra 1
> > SIMPLE gamesessions ref valid_sess valid_sess 1 const 55003 Using where;
> > Using temporary; Using filesort
> > Can this be optimized to run faster
> > Appreciate your time 
> > Kishore Jalleda
>
> There are several index changes you could make to optimize this particular
> query. The problem is, if we create too many indexes your INSERT time will
> begin to tank and your disk space will become scarce.
>
> This section of the manual definitely applies to your situation:
> http://dev.mysql.com/doc/refman/4.1/en/group-by-optimization.html
> and more generally
> http://dev.mysql.com/doc/refman/4.1/en/query-speed.html
>
> This section of the manual may also be able to help:
> http://dev.mysql.com/doc/refman/4.1/en/optimizing-database-structure.html
> in particular, read
> http://dev.mysql.com/doc/refman/4.1/en/indexes.html
> and
> http://dev.mysql.com/doc/refman/4.1/en/multiple-column-indexes.html
>
> The problem is, we can make that one query VERY fast at the expense of all
> sorts of other things. Query optimization is an art, a balancing act. You
> have to know what you are giving up when you ask for certain performance
> increases. I just don't have enough information about your overall query
> patterns to make an informed decision on which optimization will work for
> this particular query without penalizing other queries in the process.
>
> What you have to be able to answer is: How important is the speed of this
> one query compared to everything else going on in the database as a whole.
> Nobody can tell you that but you.
>
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
>
>
>


Re: Optimizing GROUP BY

2005-10-13 Thread SGreen
Kishore Jalleda <[EMAIL PROTECTED]> wrote on 10/13/2005 02:25:52 PM:

> Hi All,
>  I have a query which takes approximately 0.5 seconds to execute , it is 
as
> follows
>  SELECT gamename, MAX(score) AS score, COUNT(valid=1) AS played FROM
> gamesessions AS gamesessions
> WHERE valid=1 AND sessiontype IN (1,2)
> GROUP BY gamename;
>  EXPLAIN SELECT gives me this, also there is an index on the columns 
valid
> and sessiontype
>   id select_type table type possible_keys key key_len ref rows Extra  1
> SIMPLE gamesessions ref valid_sess valid_sess 1 const 55003 Using where;
> Using temporary; Using filesort
>   Can this be optimized to run faster
>  Appreciate your time 
> Kishore Jalleda

There are several index changes you could make to optimize this particular 
query. The problem is, if we create too many indexes your INSERT time will 
begin to tank and your disk space will become scarce.

This section of the manual definitely applies to your situation:
  http://dev.mysql.com/doc/refman/4.1/en/group-by-optimization.html
and more generally
  http://dev.mysql.com/doc/refman/4.1/en/query-speed.html

This section of the manual may also be able to help: 
 http://dev.mysql.com/doc/refman/4.1/en/optimizing-database-structure.html
in particular, read
  http://dev.mysql.com/doc/refman/4.1/en/indexes.html
and
  http://dev.mysql.com/doc/refman/4.1/en/multiple-column-indexes.html

The problem is, we can make that one query VERY fast at the expense of all 
sorts of other things. Query optimization is an art, a balancing act. You 
have to know what you are giving up when you ask for certain performance 
increases. I just don't have enough information about your overall query 
patterns to make an informed decision on which optimization will work for 
this particular query without penalizing other queries in the process.

What you have to be able to answer is: How important is the speed of this 
one query compared to everything else going on in the database as a whole. 
Nobody can tell you that but you.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine




Optimizing GROUP BY

2005-10-13 Thread Kishore Jalleda
Hi All,
 I have a query which takes approximately 0.5 seconds to execute , it is as
follows
 SELECT gamename, MAX(score) AS score, COUNT(valid=1) AS played FROM
gamesessions AS gamesessions
WHERE valid=1 AND sessiontype IN (1,2)
GROUP BY gamename;
 EXPLAIN SELECT gives me this, also there is an index on the columns valid
and sessiontype
  id select_type table type possible_keys key key_len ref rows Extra  1
SIMPLE gamesessions ref valid_sess valid_sess 1 const 55003 Using where;
Using temporary; Using filesort
  Can this be optimized to run faster
 Appreciate your time 
Kishore Jalleda


Optimizing GROUP BY

2003-10-27 Thread "Héctor Villafuerte D."
Hi!
I've found this in:
http://www.mysql.com/information/presentations/presentation-oscon2000-2719/
"Instead of doing a lot of |GROUP BY|s on a big table, create summary 
tables of the big table and query this instead."

Would you please tell me how to create "summary tables" that can help me 
get this query info:
mysql> select tel, telefb, rutaentran, rutasalien, sum(minutos) from 
traf_oper group by 1, 2, 3, 4;

This is the table info:
mysql> describe traf_oper;
++--+---+--+-+-+---+
| Field  | Type | Collation | Null | Key | Default | Extra |
++--+---+--+-+-+---+
| tel| char(8)  | latin1_swedish_ci | YES  | MUL | NULL|   |
| fecha  | char(8)  | latin1_swedish_ci | YES  | | NULL|   |
| hora   | char(6)  | latin1_swedish_ci | YES  | | NULL|   |
| telefb | char(14) | latin1_swedish_ci | YES  | MUL | NULL|   |
| tiempotasa | char(6)  | latin1_swedish_ci | YES  | | NULL|   |
| rutasalien | char(7)  | latin1_swedish_ci | YES  | | NULL|   |
| rutaentran | char(7)  | latin1_swedish_ci | YES  | | NULL|   |
| serie  | char(3)  | latin1_swedish_ci | YES  | | NULL|   |
| tipotraf   | int(1)   | binary| YES  | | NULL|   |
| minutos| int(4)   | binary| YES  | | NULL|   |
++--+---+--+-+-+---+
Thanks in advance,
Hector
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]