Hello,

I'm working on using a temporary table to get the group-wise maximum for a number of items. I have a table structure like:

CREATE TABLE item (
item_id int not null primary key,
name varchar(100) not null);

CREATE TABLE attribute_a (
index (item_id, time_id),
item_id int not null,
time_id datetime not null,
value int not null);

Each item has many attributes. The time_id of an attribute contains the time of the /last /update to the attribute. My objective is to return the the attribute's value for each item at a requested time. I believe the best solution is to get the maximum time_id's (<= requested time) and dump them into a temporary table. Then use these times to retrieve the actual values.

My problem is that as I add a number of attributes the query time bogs down when creating the temporary table. The query looks something like:

CREATE TEMPORARY TABLE times
(INDEX (item_id))
SELECT item.item_id,
MAX(attribute_a.time_id) AS attribute_a_time
FROM item
LEFT JOIN attribute_a ON
(attribute_a.item_id = item.item_id
AND attribute_a.time_id < '2000-10-01 00:00')
GROUP BY item.item_id;

I add a LEFT JOIN for each attribute that I want to retrieve (up to 60).

Let's say each attribute table contains 10,000 rows (all with dates less than '2000-10-01'). If I understand things correctly, using this query 10,000 rows would be added for each attribute that I joined. If I added 60 attributes MySQL would have to handle grouping 600,000 rows! Is that correct? Is there a better solution?

I tried using sub queries but that didn't seem to be much faster. If I had 1,000 items to search for 60 attributes the sub queries would be called 60,000 times.
Any ideas?  Thanks!

Ian



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

Reply via email to