I have some sort of problem too...

Look at this:



mysql> explain select * from game3 order by memberid;
+-------+------+---------------+------+---------+------+------+-------------
---+
| table | type | possible_keys | key  | key_len | ref  | rows | Extra
|
+-------+------+---------------+------+---------+------+------+-------------
---+
| game3 | ALL  | NULL          | NULL |    NULL | NULL | 1245 | Using
filesort |
+-------+------+---------------+------+---------+------+------+-------------
---+
1 row in set (0.02 sec)

mysql> explain select * from game3 where memberid = '1';
+-------+-------+---------------+----------+---------+-------+------+-------
+
| table | type  | possible_keys | key      | key_len | ref   | rows | Extra
|
+-------+-------+---------------+----------+---------+-------+------+-------
+
| game3 | const | memberid      | memberid |       2 | const |    1 |
|
+-------+-------+---------------+----------+---------+-------+------+-------
+
1 row in set (0.00 sec)



As you can clearly see in the 2nd query, memberid is a key, and is used
there. But why isn't it used in the ORDER BY clause?

Thanks in advance,

Leon Mergen
[EMAIL PROTECTED]
BlazeBox, Inc.
ICQ: 55677353

----- Original Message -----
From: "Lukas Knecht" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, June 11, 2001 11:48 AM
Subject: Again: ORDER BY key_part1,key_part2 does not use index


> Hi,
>
> I know this subject has been treated several times in this list (see e.g.
>
>
http://lists.mysql.com/cgi-ez/ezmlm-cgi?1:sss:65398:200102:ipomopcphmhamkmig
oob#b
>
> ), but I think it deserves further discussion.
>
> My problem is the following: I have a rather large table
> (~430M records in 21G with a 4.4G packed index) created by:
>
> CREATE TABLE T (
>   `Id` int(11) NOT NULL default '0',
>   `Id2` int(11) NOT NULL default '0',
>   `F1` smallint(6) default NULL,
>   `F2` smallint(6) default NULL,
>   `F3` smallint(6) default NULL,
>   `F4` smallint(6) default NULL,
>   `F5` float default NULL,
>   `F6` mediumtext,
>   `F7` float default NULL,
>   `F8` float default NULL,
>   KEY `TIds`(`Id`,`Id2`),
>   KEY `TId2`(`Id2`)
> ) TYPE=MyISAM MAX_ROWS=2500000000 PACK_KEYS=1;
>
> The query I want to run is:
>
> SELECT * FROM T ORDER BY Id, Id2;
>
> I would expect MySQL to use the index to retrieve the rows in sorted
> order, but this is not what happens (MySQL 3.23.38):
>
> EXPLAIN SELECT * FROM T ORDER BY Id, Id2;
>
>
+-------+------+---------------+------+---------+------+-----------+--------
--------+
> | table | type | possible_keys | key  | key_len | ref  | rows      | Extra
|
>
+-------+------+---------------+------+---------+------+-----------+--------
--------+
> | T     | ALL  | NULL          | NULL |    NULL | NULL | 431476682 | Using
filesort |
>
+-------+------+---------------+------+---------+------+-----------+--------
--------+
>
> "Using filesort" means that MySQL does the sorting itself without
> using the index. I can think of two possible implementations:
>
> (1) Create a temporary 21G file with 430M complete records, sort these by
>     (Id, Id2) and then read the data sequentially from this file. The
>     sorting can be done "on the fly" using a good mergesort implementation
>     and will use almost no random accesses with large enough buffers.
>     I expect the time required for this to be the time to read, write and
>     reread 21G: with 50MB/s I/O bandwidth, 3*21G/50MB ~ 21 min. With
>     the CPU time required for the sorting, I would expect less than an
hour.
>     The time to process the query would be dominated by reading
>     the sorted data into the application, even with a Gigabit network.
>
> (2) Create a temporary 16*430M file with 430M records (Id, Id2, record
pointer),
>     sort this by (Id, Id2), and then retrieve the complete records doing
430M
>     random accesses. From earlier experience, I assume this is what MySQL
does,
>     despite the fact that it is entirely equivalent to using the index...
>     I expect the time rqeuired for this to be dominated by the 430M random
reads.
>     On a fast RAID with 2 ms avg access time, this may require up to
>     430M * 2ms ~ 10 days, but may be substantially less if the data file
>     is already partially sorted by Id, Id2 (which it is in our case).
>
> For me, this discussion boils down to three questions:
>
> A) Does MySQL sort the entire file (1), or just the "ORDER BY" criteria
>    with subsequent random reads (2)?
>
> B) If what I believe is correct (MySQL does (2)), why does it create a
>    temporary file containing the keys and sort it instead of using
>    the index?
>
> C) The MySQL manual in
>
>
http://www.mysql.com/documentation/mysql/bychapter/manual_Performance.html#M
ySQL_indexes
>
>    says:
>
>    ...The following queries will use the index to resolve the ORDER BY
part:
>
>      SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3;
>
>    Isn't this information wrong or at least incomplete?
>
> Can anyone shed some light on this? Thanks.
>
> Lukas Knecht
> infox
> Neptunstr. 35
> CH-8032 Zürich
>
>
>
> ---------------------------------------------------------------------
> 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

Reply via email to