グループ化した中から各々の最新のレコードだけを取り出す
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商品くらいでは一番速かった。