Hello.
On Thu, Apr 25, 2002 at 01:49:39PM +0200, [EMAIL PROTECTED] wrote:
[...]
> mysql> show index from cpu;
>
>+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+---------+
> | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
>Cardinality | Sub_part | Packed | Comment |
>
>+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+---------+
> | cpu | 1 | timecode | 1 | timecode | A |
>4199933 | NULL | NULL | |
> | cpu | 1 | timecode | 2 | systemid | A |
>4199933 | NULL | NULL | |
>
>+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+---------+
> 2 rows in set (0.13 sec)
Are the pairs (timecode,systemid) unique? If so, tell MySQL so.
> ...and I execute a query like this (here with explain first) :
>
> mysql> explain SELECT substring_index(elisa.timecode,':',1),
> avg(elisa.usertime + elisa.systemtime) AS elisa,
> avg(asuncion10.usertime + asuncion10.systemtime) AS asuncion10,
> FROM cpu AS elisa, cpu AS asuncion10, cpu AS asuncion20
> WHERE elisa.systemid='44'
> AND asuncion10.systemid='47'
> AND substring_index(elisa.timecode,':',1) =
>substring_index(asuncion10.timecode,':',1)
> AND elisa.timecode > now() - INTERVAL 7 DAY
> AND asuncion10.timecode > now() - INTERVAL 7 DAY
> GROUP BY substring_index(elisa.timecode,':',1)
> ORDER BY substring_index(elisa.timecode,':',1);
>
>+------------+-------+---------------+----------+---------+------+--------+-----------------------------+
> | table | type | possible_keys | key | key_len | ref | rows | Extra
> |
>
>+------------+-------+---------------+----------+---------+------+--------+-----------------------------+
> | elisa | range | timecode | timecode | 8 | NULL | 612892 | where
>used; Using temporary |
> | asuncion10 | range | timecode | timecode | 8 | NULL | 612892 | where
>used |
>
>+------------+-------+---------------+----------+---------+------+--------+-----------------------------+
> 2 rows in set (0.02 sec)
Sorry, but the query and the explain don't fit together. Where is "cpu
AS asuncion20"? I presume that the part in the SELECT simply is left
by accident.
In this case, is MySQL's guess that it has to inspect about 612892
correct? It seems a bit high (more than 1/10th of the rows of the
table?) If not, try running ANALYZE TABLE.
If it is correct, the query will run forever, because you are going to
inspect 612892*612892 rows, including calling substring_index twice
that much.
Another thing: If you need that substring stuff regularly, your table
is not normalized enough and you should split timecode. This would
would enable MySQL to use indexes to solve the
substring_index(elisa.timecode,':',1) = substring_index(asuncion10.timecode,':',1)
part (which wouldn't call substring_index anymore)
> This query takes quite a long time to execute, and I'm sure it can
> be done more elegant and faster....just don't know how.
>
> Anyone ?
>
> It's MySQL 3.23.49 with InnoDB tables.
Bye,
Benjamin.
--
[EMAIL PROTECTED]
---------------------------------------------------------------------
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