ワイズリマインダー

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:

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください