コメントありがとうございます。 サービス終了した今なら、安く中古が手に入りそ…
1対多のテーブルを結合し多テーブルの最大値のみ取得する
ユーザーごとに最後に実行したデータを取得したい時のクエリーをチューニングしてみた。
1つ目のテーブルはユーザーリスト
userId(Primary)
userName
2つ目のテーブルはそのユーザーごとのデータが保存されている。
id(Primary)(AutoIncrement)
userId(Index)
処理に時間がかかっていたクエリ
SELECT `T1`.`userId` FROM `table1` AS `T1` INNER JOIN `table2` AS `T2` ON `T2`.`userId` = `T1`.`userId` GROUP BY `T1`.`userId` ORDER BY `T1`.`userId` DESC ,`T2`.`id` DESC ; /* この時のEXPLAIN */ id: 1 select_type: SIMPLE table: T1 type: index possible_keys: PRIMARY key: PRIMARY key_len: 8 ref: NULL rows: 462 Extra: Using temporary; Using filesort
JOINしてからGROUPするとメモリーが足らなくなり一時テーブルを作成してしまったようだ。
JOINする前に数を減らすことで改善した。
SELECT `T1`.`userId` FROM `table1` AS `T1` INNER JOIN `table2` AS `T2` ON `T2`.`id` = (SELECT MAX(`T`.`id`) FROM `table2` AS `T` WHERE `T`.`userId = `T1`.`userId`) ORDRE BY `T1`.`userId` DESC ; /* この時のEXPLAIN */ id: 1 select_type: PRIMARY table: T1 type: index possible_keys: NULL key: PRIMARY key_len: 8 ref: NULL rows: 5 Extra:
検索
コメントを残す