グループ化した中から各々の最新のレコードだけを取り出す

create table 商品(
商品CD char(10) not null,
商品名 varchar(100) not null,
primary key(商品CD));

create table 価格(
ID int(10) unsigned auto_increment not null,
商品CD char(10) not null,
単価 int(10) unsigned not null,
日時 datetime not null,
primary key(ID));

select * from 価格 where 商品CD="GA08455500"\G
 *************************** 1. row ***************************
      ID: 96
商品CD: GA08455500
   単価: 84990
    日時: 2009-04-21 11:11:25
 *************************** 2. row ***************************
      ID: 1850
商品CD: GA08455500
   単価: 74990
    日時: 2009-04-22 19:40:18
 *************************** 3. row ***************************
      ID: 2166
商品CD: GA08455500
   単価: 69990
    日時: 2009-05-09 04:00:39
3 rows in set (0.00 sec)



みたいなテーブルがあって、商品CDごとに最新の単価を抽出したい場合、

select
   *
from
   価格 p
where
   id=(select max(ID) from 価格 where p.商品CD=商品CD);


とかしたらいいかというと、これが無茶苦茶遅くて、
価格テーブルの件数2219件(うちユニークな商品CDが2084件)で8秒ほどかかった。
MySQLのバージョンは5.0.67、エンジンはMyISAM

次に、

select
   *
from
   価格
where
   (商品CD,日時) in (select 商品CD,max(日時) from 価格 group by 商品CD);


としたら、もっと遅くなってしまい結局

select * from 価格 where 商品CD="*****" order by date desc limit 1


みたいなクエリを投げて、1つずつ商品に価格を後付けするのが50商品くらいでは一番速かった。